Java多线程之 Thread VS Runnable 的区别
摘自:https://blog.csdn.net/uniquewonderq/article/details/48137767
为此,我们举个例子,假设有火车站有三个窗口,在卖火车票,总共只有5张票。每一个线程相当于一个窗口,分别售票
-
<strong>package com.thread;
-
class myThread extends Thread{
-
private int ticketsCount=5;//一种有5张票
-
private String name;//窗口,也即是线程的名字
-
public myThread(String name){
-
this.name=name;
-
}
-
@Override
-
public void run() {
-
while(ticketsCount>0) {
-
//ticketsCount--;//如果还有票,就卖掉一张
-
System.out.println(name+"有"+ticketsCount+"张票,卖了1一张票,剩余票数为:"+ --ticketsCount);
-
//System.out.println(name+"卖了1一张票,剩余票数为:"+ticketsCount);
-
}
-
}
-
}
-
public class TicketsTread {
-
public static void main(String args[]) {
-
//创建三个线程,模拟三个窗口卖票
-
myThread t1=new myThread("窗口1");
-
myThread t2=new myThread("窗口2");
-
myThread t3=new myThread("窗口3");
-
//启动这三个线程,也即是窗口开始卖票
-
t1.start();
-
t2.start();
-
t3.start();
-
}
-
}
-
</strong>
输出为:
这样的结果说明了,每个窗口(线程)都卖了5张票,这是因为创建了3个Thread对象,每个对象有自己的成员实例变量。
因为每个线程,mt1,mt2,mt3分别是一个继承了Thread类的一个对象,所以对象拥有其所属类的私有或共有的成员变量或者成员方法,也就是说他们的变量,也即是票数ticketCount都是每个对象“自己”私有的,“各自为营”,资源并不是共享的。 那么,你就会看到,每个窗口都有5张票的情况咯。。
再使用runnable 来实现这个示例。
-
package com.thread;
-
class myThread_Runnable implements Runnable{
-
private int ticketsCount=5;//一种有5张票
-
public void run() {//如果给run方法加锁,那么会出现一个窗口会卖光所有票的现象
-
while(ticketsCount>0) {
-
ticketsCount--;//如果还有票,就卖掉一张
-
System.out.println(Thread.currentThread().getName()+"卖了1一张票,剩余票数为:"+ticketsCount);
-
}
-
}
-
}
-
public class TicketsRunnable {
-
public static void main(String args[]){
-
myThread_Runnable mt=new myThread_Runnable();
-
//创建三个线程,来模拟三个售票窗口
-
Thread t1=new Thread(mt,"窗口1");
-
Thread t2=new Thread(mt,"窗口2");
-
Thread t3=new Thread(mt,"窗口3");
-
//启动这三个线程,也即是三个窗口,开始卖票
-
t1.start();
-
t2.start();
-
t3.start();
-
}
-
}
上面这个是一个及其特殊的情况,线程(窗口)1一次性的使用了CPU并执行完了了run方法的所有代码,然后进程结束。
下面这个是一般性的结果:
例2.
总结:1.继承thread只,线程不共享,每个线程只是针对一个线程。
2.实现Runnable接口,可以线程共享,如果多个thread线程实体的参数是同一个Runnable接口实体,则实现线程共享,如果thread参数不是同一个Runnable接口实体,则每个线程就是单独的一个对象(此时不共享:例2.)。
上面这个输出就可以看出来,线程资源抢夺所导致的交叉执行。
上一篇: Flex 4 打印预览
推荐阅读
-
Android开发笔记之:Handler Runnable与Thread的区别详解
-
Java中实现多线程继承Thread类与实现Runnable接口的区别
-
Java 继承Thread 实现Runnable接口和实现Callable接口创建线程的区别
-
Java中Runnable和Thread的区别
-
Java多线程实现(2)---Thread与Runnable区别
-
Java多线程之Thread VS Runnable
-
Java多线程之 Thread VS Runnable 的区别
-
java多线程之Thread VS Runnable
-
Java多线程中关于Thread与runnable的区别详解
-
Android 之 实现Runnable 接口与继承Thread的区别