多线程——实现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接口。


 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值