• 【常用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方法加入的线程

  • 相关阅读:
    UESTC
    Education Round 8 A
    Gym
    Gym
    hdoj 1159 Common Subsequence
    UVA
    UESTC
    51Nod 1068 Bash游戏 V3 (这规律不好找)
    51Nod 1066 Bash游戏
    51Nod 1002 数塔取数问题
  • 原文地址:https://www.cnblogs.com/jiarenanhao/p/14134115.html
Copyright © 2020-2023  润新知