【常用API】之有返回的多线程Callable

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;
    }

    
    
    
}

 

小结:

CallableRunnable

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方法加入的线程

 

posted @ 2020-12-14 16:50  Mr.chris  阅读(178)  评论(0编辑  收藏  举报