线程的定义
什么是线程,有很多种说法,我们简单的理解一下:线程就是在一个进程当中私有运行的一个子任务子单元。
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抢到哪个线程,就执行哪个。
看完,你明白了吗?
下一篇:线程状态流程解析