博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一:线程的定义,start和run的使用,main和thread的执行顺序
阅读量:4212 次
发布时间:2019-05-26

本文共 3056 字,大约阅读时间需要 10 分钟。

线程的定义

        什么是线程,有很多种说法,我们简单的理解一下:线程就是在一个进程当中私有运行的一个子任务子单元。

1:先来了解一下线程的2个方法

1)start:用来开启一个新的线程并且执行run方法
2)run:不新起线程,直接在当前线程中执行Thread的run方法

我们通过2个例子来彻底弄懂一下:

实例1,查看start和run的区别:

package com.test.main;public class Test {
public static void main(String[] args) {
int a = 10; System.out.println("Main-a:"+a); Thread thread = new Thread(new Runnable() {
public void run() {
System.out.println("执行Runnable1中打印线程名:"+Thread.currentThread().getName()); } }); thread.setName("自定义Thread"); thread.start(); Thread thread2 = new Thread(new Runnable() {
public void run() {
System.out.println("执行Runnable2中打印线程名:"+Thread.currentThread().getName()); } }); thread2.setName("自定义Thread2"); thread2.run(); System.out.println("执行Main中打印线程名:"+Thread.currentThread().getName()); }}运行结果:Main-a:10执行Runnable2中打印线程名:main执行Main中打印线程名:main执行Runnable1中打印线程名:自定义Thread说明:1:start会新起一个线程,去私有的执行他的run方法2:new一个Thread直接执行run方法,他不会新起一个线程,他会在当前所在线程去执行这个new线程的Thread方法

看下面的例子来证明一下:

package com.test.main;public class Test {
static class MyThread extends Thread{
public MyThread(String name){
super(name); } public void run(){
System.out.println("myThread打印线程名"+Thread.currentThread().getName()); } } public static void main(String[] args) {
int a = 10; System.out.println("Main-a:"+a); MyThread thread = new MyThread("myThread"); thread.run(); System.out.println("执行Main中打印线程名:"+Thread.currentThread().getName()); }}

调试过程如图:

在这里插入图片描述

实例2:main线程和Thread默认的执行顺序问题

package com.test.main;public class Test {
public static void main(String[] args) {
int a = 10; System.out.println("Main-a:"+a); Thread thread = new Thread(new Runnable() {
public void run() {
for(int i = 0 ;i < 1000;i++){
System.out.println("第"+i+"次执行Runnable1中打印线程名:"+Thread.currentThread().getName()); } } }); thread.setName("自定义的Thread1"); thread.setPriority(10); thread.start(); Thread thread2 = new Thread(new Runnable() {
public void run() {
for(int i = 0 ;i < 1000;i++){
System.out.println("第"+i+"次执行Runnable2中打印线程名:"+Thread.currentThread().getName()); } } }); thread2.setName("自定义的Thread2"); thread2.setPriority(10); thread2.start(); for(int i = 0 ;i < 1000;i++){
System.out.println("第"+i+"次执行Main中打印线程名:"+Thread.currentThread().getName()); } }}运行结果:看其中一段:第314次执行Runnable2中打印线程名:自定义的Thread2第580次执行Runnable1中打印线程名:自定义的Thread1第687次执行Main中打印线程名:main第581次执行Runnable1中打印线程名:自定义的Thread1第315次执行Runnable2中打印线程名:自定义的Thread2第582次执行Runnable1中打印线程名:自定义的Thread1第688次执行Main中打印线程名:main说明:这个程序有main线程,Thread1,Thread2,他们的执行先后顺序是随机无序的,cpu抢到哪个线程,就执行哪个。

看完,你明白了吗?

下一篇:

转载地址:http://nikmi.baihongyu.com/

你可能感兴趣的文章
CREATE TABLE A LIKE B
查看>>
bs调用另一个vbs的函数
查看>>
mysql的“Got error 28 from storage engine”错误
查看>>
jdk安装
查看>>
存档数据迁移
查看>>
查看表对应的文件组
查看>>
压缩表
查看>>
SQL Server 分布式事务
查看>>
存在防火墙时MSDTC的运行配置
查看>>
SQL Server未将服务器 DBSERVER 配置为用于 DATA ACCESS
查看>>
拦截数据库增删改操作
查看>>
10倍以上提高Pentaho Kettle的MySQL写入速度
查看>>
MySQL的Galera Cluster配置说明
查看>>
SQL 添加链接服务器
查看>>
MySQL随机查询rand()优化
查看>>
dos调度ETL转换
查看>>
mysql myisam optimize任务
查看>>
myisamchk命令使用总结
查看>>
report server tempdb 过大问题
查看>>
sql server时间戳timestamp
查看>>