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

多线程——实现Runnable接口

时间: 2024-08-29 02:03:04

多线程——实现Runnable接口的相关文章

java多线程--实现Runnable接口方式

因为java类只能继承一个类可以实现多个接口的特性,所以一般情况下不推荐使用继承Thread类实现多线程,下面是实现Runnable接口方式的简单多线程代码 package text; /** * 多线程 * @author admin * */ public class Threads { public static void main(String[] args){ Thread_1 t1=new Thread_1(); Thread thread1 =new Thread(t1); thr

java多线程--实现Runnable接口

package unit8; import java.applet.Applet; import java.awt.Label; import java.awt.TextField; public class TestRunnable extends Applet implements Runnable{ Label prompt1 = new Label("The first thread:"); Label prompt2 = new Label ("The second

Java Tread多线程(1)实现Runnable接口

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39347245 本文演示,Tread多线程实现Runnable接口,以及简单的说明为什么有这种创建线程的方法. 一.创建线程的2中方法: 1)继承Thread类实现多线程,参见我的上一篇文章:Java Tread多线程(0)一个简单的多线程实例 : 2)第二种方法就是实现Runnable接口,创建一个新线程. 二.为什么要有这两种方法创建线程呢? ①主要原因:就是方法1)不

多线程——实现Callable接口

前两篇博客(多线程--继承Thread类,多线程--实现Runnable接口 )介绍了java使用线程的两种方法,这篇博客继续介绍第三种方法--实现Callable接口. 先说一下Runnable和Callable的区别: 1.Callable规定的方法是call(),Runnable规定的方法是run(). 2.Callable的任务执行后可返回值,而Runnable的任务是不能返回值得 3.call方法可以抛出异常,run方法不可以 4.运行Callable任务可以拿到一个Future对象,

Java通过继承thread类与实现Runnable接口实现多线程的区别

Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 一.通过继承Thread类实现多线程 class MyThread extends Thread{ String name = null; int ticket = 0; public MyThread(String name){ this.name = name; } public synchronized v

实现多线程的两种方法:继承Thread类或实现Runnable接口

实现多线程的两种方法:继承Thread类或实现Runnable接口 Java中实现多线程有两种方法:继承Thread类和实现Runnable接口,在程序开发中只要是多线程,我们一般都是实现Runnable接口,原因归结为一点:实现接口比继承类要好. 多线程的第一种实现方式:继承Thread类 步骤如下 创建一个继承Thread的类(假定为A),并重写Thread的run方法 构造一个A类对象,假定为aa 调用aa的start方法.(start方法是从Thread继承过来的) 具体例子如下 pac

JAVA学习第二十三课(多线程(二))- (多线程的创建方式二 :实现Runnable接口(常用))

当一个类有父亲,但是其中的功能还希望实现线程,那么就不能采用继承Thread的方式创建线程 那么就可以通过接口的方式完成 准备扩展Demo类的功能,让其中的内容可以作为线程的任务执行 实现Runnable接口,Runnable接口中只有一个方法run 一.创建线程的第二种方法 Runnable的出现仅仅是将线程的任务进行了对象的封装 /* * 创建线程的第二种方法 * 1.定义类实现Runnable接口 * 2.覆盖接口中的fun方法,将线程的任务代码封装到run方法中 * 3.通过Thread

探Java多线程Thread类和Runnable接口之间的联系

首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情况 情况1: 继承Thread类.重写其方法run() .    然后new之.调用Start()方法 1 public class TestThread 2 { 3 private int i; 4 public static void main(String[] args) 5 { 6 // T

java多线程编程中实现Runnable接口方法相对于继承Thread方法的优势

 java多线程创建方法http://blog.csdn.net/cjc211322/article/details/24999163  java创建多线程方法之间的区别http://blog.csdn.net/cjc211322/article/details/25000449 java多线程编程中实现Runnable接口方法相对于继承Thread方法的优势