Java从【JDK1.5】开始,
提供了 Callable 和 Future,
通过他们可以在任务执行完毕后
得到任务的结果,新的线程创建方式:
Callable
Future
他们里面有特定方法,允许线程执行完毕,返回结果:写return的。
实例:
package com.xzm.有返回多线程; //导入需要的包 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class _01_实现有返回的多线程 { public static void main(String[] args) { System.out.println("主线程启动......"); //实例化创建 Callable的实现类对象 MyCallable my = new MyCallable(); //【Future】: //创建FutureTask操作对象,代入实现类 //把自定义的Callable实现类,转换成可操作的线程类 FutureTask<Integer> ft = new FutureTask<Integer>(my); //创建子线程 Thread t = new Thread(ft); //启动 t.start(); //提供的方法 //线程是否结束 System.out.println("线程结束了吗?" + ft.isDone()); int value = 0; try { //得到返回结果,会强制异常处理 value = ft.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println("主线程得到结果了=" + value); System.out.println("线程结束了吗?" + ft.isDone()); } } //===================================================== //【Callable接口的实现类】 //第一步:自定义一个类,继承Callable接口, // 它是泛型的, // 指定操作及返回的数据类型 class MyCallable implements Callable<Integer>{ private String name; public MyCallable(String name){ this.name = name; } @Override public Integer call() throws Exception { return null; } }
小结:
Callable 与 Runnable:
java.lang.Runnable;它是一个接口,里面声明了一个run()方法,
方法返回的是void.
public interface Runnable{
public abstract void run();
}
因此,方法执行完毕后,没有返回结果的。
-执行操作,针对共有的数据对象,代码中操作。
java.util.Concurrent;它也是一个接口,在它里面也声明了一个call()方法,
这个方法返回一个泛型对象。
public interface Callable<T>{
public abstract T call();
}
因此,方法执行完毕,才会得到一个return的结果。
-执行操作,玩去可以替代Runnable,同时还可以得到return的结果。
什么使用Callable对象呢?
Java提供了Future来使用它。
<T> Future submit(Callable<T> task);
=============================================================
Runnable接口,实现类继承Runnable,实现方法run,创建Thread对象使用。
多线程,【无法返】回操作。
Callable接口,实现类继承Callable,实现方法call,创建Future对象使用。
多线程,【有返回】的操作。
有三个大功能:
1、判断任务是否完成
2、能中断任务
3、可以获取任务执行结果
所有的操作,最终都是创建Thread,代入指定对象,调用start方法
=============================================================
Runnable接口
|------Thread实现类
//自定义的类:第三代,
public class my extends Thread{}
//自定义实现类:第二代,【推荐】
public class my implements Runnable{}
=================================================================
在java中,每一个线程都有一个自己的优先级。
默认情况下,一个想冲,继承它的父类线程的优先级。
我们可以使用方法 setPrioerity() 提高或降低一个指定线程的优先级
当系统调度的时候,它首先选择高优先级的线程。
但是优先级是高度依赖于操作系统的。
Windows默认有7个线程的优先级 1-7
Linux上的java虚拟机忽略了线程的优先级
==================================================================
不管是 Runnable还是Callable,他们最终都是创建成线程对象Thread,
thread提供了多个方法,可以控制线程。
sleep()
休眠,
让线程在指定时间内不再运行。
进入CPU,暂时不执行,等一会再执行,
可以保证当前就是我这个线程占据cpu,其他线程都在后面排队。
yield()
让步,
线程暂停,进入就绪状态,重写等待系统调度。
后边获取到调度的线程,可能是其他线程,也可能是当前线程。
interrupt()
中断,
中断当前线程,另外一个程序去执行
join()
加入,
阻塞当前调用的线程,强制执行join方法加入的线程