实现多线程方式三种方式

来源:互联网 发布:linux打包命令 tar 编辑:程序博客网 时间:2024/05/17 23:05

2015年1月11日13:43:29 天气阴

方式一:继承Thread类

步骤:

1.继承Thread

2.重写run方法,线程执行体(希望多线程完成什么任务就在run方法中作)

3.创建线程实例,然后调用start方法启动线程,让线程进入就绪状态,并没有运行,什么时候运行了,由系统决定

注意:不要调用run方法,如果调用了run方法,就是单线程效果

 TestThread.java

public class TestThread extends Thread {// 继承Thread方式 并 重写 run方法(没有返回值、不能 throws 异常)@Overridepublic void run() {Thread thread = Thread.currentThread();for (int i = 0; i < 10; i++) {//getId()获得当前线程的编号 getName()获得当前线程的名字System.out.println("-run-" + i + "--" + thread.getId() + "--" + thread.getName());}}public static void main(String[] args) {TestThread testThread = new TestThread();// 调用start方法(线程并不是立即运行,进入一个 就绪状态)testThread.start();Thread mainThread = Thread.currentThread();for (int i = 0; i < 10; i++) {System.out.println("-main-" + i + "--" + mainThread.getId() + "--" + mainThread.getName());}}}

方式二:实现Runnable接口(*)

步骤:

1.实现Runnable接口

2.重写run方法

3.创建一个Runnable实例交给Thread构造器

4.调用Thread的start方法(启动线程,进入就绪状态)

TestRunnable.java

//1:实现 Runnable接口 public class TestRunnable implements Runnable{//2: 重写run方法@Overridepublic void run() {Thread runnableThreadInfo = Thread.currentThread();for (int i = 0; i < 10; i++) {System.out.println("-run-"+ i + "--" + runnableThreadInfo.getId() + "--" + runnableThreadInfo.getName());} } public static void main(String[] args) {//3: 创建一个Runnable实例 交给 Thread 构造器Runnable runnable = new TestRunnable();Thread threadThread = new Thread(runnable);//4:调用Thread的strat方法(启动线程,进入就绪状态)threadThread.start();Thread maintThread = Thread.currentThread();for (int i =0; i < 10; i++) {System.out.println("-main-" + i + "--" + maintThread.getId() + "--" +maintThread.getName());} }}



方式三:实现Calable接口

为了解决Runnable接口的不足,Java5 新增了Callable接口

Callable接口相当于Runnable的增强版,它包含了call方法,该方法就有返回值,也声明了抛出异常。

步骤:

1.实现Callable接口

2.重写call方法(可以有返回值,可以throws异常)-----call方法就是和原来的run一样的,都是写多线程需要执行的代码的线程体方法

3.创建Callable类的实例交给FutureTask构造器

4.将创建好的FutureTask实例交给Thread的构造器

5.通过Thread的start方法启动线程,就如就绪状态

//可以通过FutureTask的实例的get方法获得call方法执行完毕返回的结果(get方法时阻塞方法)

TestCallable.java

import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;//1: 实现 Callable 接口public class TestCallable implements Callable<Integer>{//2: 重写call方法(可以有返回值, 可以throws 异常) --call 方法就是和原来的run一样的,都是写多线程需要执行的代码的线程体方法@Overridepublic Integer call() throws Exception {int sum = 0;Thread callThreadInfo = Thread.currentThread();for (int i = 0; i < 10; i++) {System.out.println("-call-" + i + "--" + callThreadInfo.getId() + "--" + callThreadInfo.getName());sum += i;} return sum;}public static void main(String[] args) throws Exception {//3: 创建Callable类的实例交给 FutureTask构造器Callable<Integer> callable = new TestCallable();FutureTask<Integer> futureTask = new FutureTask<Integer>(callable);//4: 将创建好的FutureTask实例交给Thread构造器Thread callableTreThread = new Thread(futureTask);//5: 通过Thread的start方法启动线程 ,进入 就绪状态callableTreThread.start();Thread mainThread = Thread.currentThread();for (int i =0; i < 10; i++) {System.out.println("-main-" + i + "--" + mainThread.getId() + "--" + mainThread.getName());} //可以通过FutureTask的实例的get方法获得call方法执行完毕返回的结果 (注意get方法是阻塞方法)System.out.println("获得call方法执行完毕返回的结果:"+futureTask.get());}}




0 0
原创粉丝点击