多线程——达到Runnable介面
部分博客(多线程——继承Thread类)介绍了java多线程的第一种实现方法——继承Thread类。这篇博客介绍另外一种方法——实现Runnable接口,并实现run方法。
还用上篇博客的样例。如今用另外一种方法实现。详细代码例如以下:
public class Test2 implements Runnable{ private String word; public Test2(String word){ this.word = word; } @Override public void run() { System.out.println(Thread.currentThread().getName() + ": 開始运行!" ); try { //如果处理须要2秒 Thread.currentThread().sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ": 正在处理!" ); System.out.println(Thread.currentThread().getName() + ": " + word + "长度为:" + word.length()); } public static void main(String [] args ) { String [] words = {"first","second","world","thread"}; for(String word : words){ Test2 test = new Test2(word); Thread thread = new Thread(test); thread.start(); } } }
运行结果例如以下:
Thread-0: 開始运行!
Thread-3: 開始运行!
Thread-2: 開始运行!
Thread-1: 開始运行!
Thread-1: 正在处理。
Thread-1: second长度为:6
Thread-3: 正在处理!
Thread-3: thread长度为:6
Thread-2: 正在处理。
Thread-2: world长度为:5
Thread-0: 正在处理!
Thread-0: first长度为:5
我们看到,使用Runnable,相同实现了功能。事实上。凡是能用继承Thread实现的,统统能够使用Runnable来实现。
由于Thread类相同实现了Runnable接口。我们使用继承Thread类来实现多线程仅仅是Runnable的一个特例。
上篇博客我们还提到了继承Thread类无法实现资源共享,而Runnable能够,那么,如今就让我们看看怎样使用Runnable来实现资源共享。
换一个样例,如果火车站分三个窗体卖票,共卖100张票。
让我们用Runnable来实现一个这个样例。详细代码例如以下:
public class Test3 implements Runnable{ private Integer ticket = 100; public void run() { System.out.println(Thread.currentThread().getName() + ": 開始卖票!" ); while(ticket > 0){ try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":卖掉 " + ticket-- + " 号票 "); } } public static void main(String [] args ) { Test3 test = new Test3(); Thread t1=new Thread(test,"1号窗体"); Thread t2=new Thread(test,"2号窗体"); Thread t3=new Thread(test,"3号窗体"); t1.start(); t2.start(); t3.start(); } }
运行结果例如以下:
1号窗体: 開始卖票! 2号窗体: 開始卖票!3号窗体: 開始卖票。 2号窗体:卖掉 100 号票 1号窗体:卖掉 99 号票 3号窗体:卖掉 98 号票 2号窗体:卖掉 97 号票 1号窗体:卖掉 96 号票 3号窗体:卖掉 95 号票 2号窗体:卖掉 94 号票 1号窗体:卖掉 93 号票 3号窗体:卖掉 92 号票 2号窗体:卖掉 91 号票 ………………………… ………………………… 1号窗体:卖掉 10 号票 2号窗体:卖掉 9 号票 3号窗体:卖掉 8 号票 1号窗体:卖掉 7 号票 2号窗体:卖掉 6 号票 3号窗体:卖掉 5 号票 1号窗体:卖掉 4 号票 2号窗体:卖掉 3 号票 3号窗体:卖掉 2 号票 1号窗体:卖掉 1 号票 2号窗体:卖掉 0 号票 3号窗体:卖掉 -1 号票
从结果上来看。确实实现了资源共享,三个窗体确实操作的都是那100张票。但细致一看,结果还是有问题的。问题例如以下:
1号窗体:卖掉 1 号票
2号窗体:卖掉 0 号票
3号窗体:卖掉 -1 号票
我们运行的是while(ticket > 0)代码,怎么还会出现0、-1 呢? 这就是数据同步的问题。
事实上,凡是涉及到资源共享的,数据同步是必需要考虑的。
本篇博客重点说明资源能够共享,至于线程安全的问题。有兴趣的朋友能够继续完好。
使用Runnable实现多线程就讲到这里。下篇博客继续介绍第三种实现多线程的方法——实现Callable接口。
版权声明:本文博主原创文章,博客,未经同意不得转载。