当我们继承Thread的时候可以看出。
调用run()与start()来启动多线程是有区别。
如下我们开启多线程时
MyThread mt1 = new MyThread(“线程A”);
MyThread mt1 = new MyThread(“线程A”);
mt1.run():
mt2.run():
发现以上的程序是先执行完mt1后执行mt2,并没有交错运行。也就是说此次线程并没有启动,还是属于顺序式的执行方式。那么我们以star()来启动线程回事如何?
MyThread mt1 = new MyThread(“线程A”);
MyThread mt1 = new MyThread(“线程A”);
mt1.start():
mt2.start():
结果中可以发现两个线程是交错运行的。哪个线程先抢到了CPU资源,哪个线程就可以运行。所以程序每次运行输出的顺序式不一样的。单虽然调用的是start()但是最终还是调用的是run()方法。
以下是Start()部分源代码:
当我们调用多次start()时会产生错误。这也是避免了重复调用start()。
还有Thread本身实现了Runable从源代码中可以看出:
如果一个类只能继承Thread类才能实现多线程,则必定受到单线程的局限性。
所以一般来说我们会用Runable接口来完成多线程操作。
那么问题是实现Runable接口的类是没有start()方法的。
Thread提供以构造函数来传递Runable对象。
Public Thread(Runable target);
Public Thread(Runable target,String name);
那么我们可以通过Thread启动实现Runable接口的类了。
new Thread(MyRunable).start();
Thread与Runable的重要区别之一是:
Thread不适合于多线程共享资源。
Runable可以方便地实现资源的共享。
class MyThread extends Thread{ private int ticket = 5; public void run(){ for(int i=0;i<5;i++){ if(ticket>0) System.out.println(“卖票:ticket = “ + ticket--); } } } public class ThreadDemo{ public static void main(String args[]){ MyThread mt1 = new MyThread(); MyThread mt1 = new MyThread(); MyThread mt1 = new MyThread(); mt1.start(); mt2.start(); mt3.start(); } }
运行结果为依次重复54321三次:
class MyThread implements Runable{ private int ticket = 5; public void run(){ for(int i=0;i<5;i++){ if(ticket>0) System.out.println(“卖票:ticket = “ + ticket--); } } } public class ThreadDemo{ public static void main(String args[]){ MyThread runable = new MyThread(); new MyThread(runable).start(); new MyThread(runable).start(); new MyThread(runable).start(); } }
运行结果你会发现只会输出一次54321:
简单介绍一下线程状态: