zoukankan      html  css  js  c++  java
  • 多线程——达到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接口。


     

     

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Tensorflow笔记:反向传播,搭建神经网络的八股,(损失函数loss,均方误差MSE,反向传播训练方法,学习率)
    Tensorflow笔记:神经网络的参数,神经网络的搭建,神经网络的前向传播
    Tensorflow笔记:tensorflow 的基本概念(张量,数据类型,计算图,会话)
    PAT (Advanced Level) Practice 1001 A+B Format
    深度学习Tensorflow 之 MNIST手写数字识别
    MNIST数据集介绍及读取
    深度学习Tensorflow非线性回归案列
    TensorFlow 完整的TensorFlow入门教程
    centos7 解决下载速度慢的问题
    Structs复习 ActionMethod
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4878230.html
Copyright © 2011-2022 走看看