zoukankan      html  css  js  c++  java
  • Java多线程

    已知的创建多线程的方法有继承Tread类和实现Runnable方法。此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体。但是call()方法与run()方法有些不同:

    • call()方法可以有返回值
    • call()方法可以抛出异常

    不过Java不允许Callable对象直接作为Thread的target。而且call()方法还有一个返回值——call()方法并不是直接调用,他是做为线程执行体被调用的。Java提供了Future接口来代表Callable接口里call()方法的返回值,并为Future接口提供了一个FutureTask实现类,该实现类实现了Future接口,并实现了Runnable接口,因此可以将之作为Thread的target。

    使用Callable和Future创建线程的步骤如下:

    1. 创建Callable接口的实现类,并实现call方法;
    2. 创建Callable接口实现类的实例,使用FutureTask类来包装Callable对象;
    3. 使用FutureTask对象作为Thread对象的target创建并启动新线程;
    4. 调用FutureTask对象的方法来获得子线程执行结束后的返回值。

    附上实现代码:

    package net.ibuluo.hunter;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.FutureTask;
    
    class MyThread implements Callable<String>{
        public String call() throws Exception {
            for(int i=0; i<20; i++){
                System.out.println(Thread.currentThread().getName() + " ---- " + i);
            }
            return "This is a Test!";
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            
            MyThread mt = new MyThread();
            FutureTask<String> ft = new FutureTask<String>(mt);
            for(int i=0; i<20; i++){
                System.out.println(Thread.currentThread().getName() + " ---- " + i);
                if(i==10){
                    new Thread(ft, "子线程1").start();
                }
            }
            
            try{
                System.out.println("子线程返回值:" + ft.get());
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    Android 获取自带浏览器上网记录
    android 中的 ViewPager+ Fragment
    Git分支操作
    图形验证码的识别
    mac平台搭建安卓开发环境
    [报错集合]Uncaught ReferenceError: xxx is not defined
    Centos安装Python3
    VSCode 代码格式化 快捷键
    Mac下用Parallels Desktop安装Ubuntu
    请求头headers
  • 原文地址:https://www.cnblogs.com/amunote/p/4138894.html
Copyright © 2011-2022 走看看