java多线程-基础
1. 基本用法
总共两种,
第一种:继承Runnbale接口,实现run方法
Runnable r = new Runnable() { @Override public void run() { System.out.println("123"); } }; Thread thread = new Thread(r); thread.start();
第二种:继承Thread类,重写run方法
class MyThread extends Thread{ @Override public void run() { for(int i = 0;i<10;i++){ System.out.println(Thread.currentThread().getName()); } } }
调用的时候
MyThread myThread = new MyThread(); myThread.start();
总结:两种的区别是,没区别,两种都需要new一个Thread的实例,第一种就是传入Runnable实例,当Thread类的run被调用的时候,调用Runnable的run方法。第二种是重写Thread的run方法,意思就是说,不执行父类Thread里面的run方法了,直接执行你重写的run里面的内容,所以结果也是一样。如果当前类已继承了一个父类,不能继承Thread,那么就可以考虑继承Runnable接口。个人认为继承Runnable接口更家灵活。
2. 线程随机性
这里就写了一段代码,测试效果,可以看出来,每次执行的结果都是不一样的,证明,线程具有随机与不确定性,Thread的start方法就是告诉CPU,线程准备就绪,等待CPU的调用run方法,所以当CPU空闲的时候,他就会去调用run的方法。所以为什么上面的代码里面调用的是start而不是run,因为调用start最终的结果是由另外一个线程调起run方法,而如果一开始调用run,那就不是在同一个线程当中执行。切记这一点
public class TestThread { public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); for(int i = 0;i<10;i++){ System.out.println(Thread.currentThread().getName()); } } } class MyThread extends Thread{ @Override public void run() { for(int i = 0;i<10;i++){ System.out.println(Thread.currentThread().getName()); } } }
第一次执行结果:
第二次执行结果:
3. 调用start顺序不代表线程启动顺序
这里写了一段代码测试,循环新建线程并调用start,按顺序应该从0到9,但结果并没有,每一次运行的结果都不一样,而且是无序,代表start的顺序并不代表run被调用的顺序
public class TestThread { public static void main(String[] args) { for(int i = 0;i<10;i++){ MyThread myThread = new MyThread(i); myThread.start(); } } } class MyThread extends Thread{ private int ti; public MyThread(int ti){ this.ti = ti; } @Override public void run() { System.out.println("Thread_" + ti); } }
第一次运行结果:
第二次运行结果: