zoukankan      html  css  js  c++  java
  • Java 实现多线程的三种方式

    import java.util.concurrent.Callable;
    import java.util.concurrent.FutureTask;
    
    public class Main {
    
        public static void main(String[] args) {
            //方法一:继承Thread
            int i = 0;
    //        for(; i < 100; i++){
    //            System.out.println(Thread.currentThread().getName() + " " + i);
    //            if (i == 5) {
    //                ThreadExtendsThread threadExtendsThread = new ThreadExtendsThread();
    //                threadExtendsThread.start();
    //            }
    //        }
            
            //方法二:实现Runnable
    //        for(i = 0; i < 100; i++){
    //            System.out.println(Thread.currentThread().getName() + " " + i);
    //            if (i == 5) {
    //                Runnable runnable = new ThreadImplementsRunnable();
    //                new Thread(runnable).start();
    //                new Thread(runnable).start();
    //            }
    //        }
    
            //方法三:实现Callable接口
            Callable<Integer> callable = new ThreadImplementsCallable();
            FutureTask<Integer> futureTask = new FutureTask<>(callable);
            for(i = 0; i < 100; i++){
                System.out.println(Thread.currentThread().getName() + " " + i);
                if (i == 5) {
                    new Thread(futureTask).start();
                    new Thread(futureTask).start();
                }
            }
            try {
                System.out.println("futureTask ruturn: " + futureTask.get());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    方法一,继承自Thread

    public class ThreadExtendsThread extends Thread {
        private int i;
        @Override
        public void run() {
            for(; i < 100; i++) {
                System.out.println(getName() + " " + i); 
            }
        }
    }

    run方法为线程执行体,ThreadExtendsThread对象即为线程对象。

    方法二,实现Runnable接口

    public class ThreadImplementsRunnable implements Runnable {
        private int i;
        @Override
        public void run() {
            for(; i < 100; i++){
                System.out.println(Thread.currentThread().getName() + " " + i);
            }
        }
    }

    run方法为线程执行体,使用时New一个Thread对象,Runnable对象作为target传递给Thread对象。且同一个Runnable对象可作为多个Thread的target,这些线程均共享Runnable对象的实例变量。

    方法三,实现Callable接口

    import java.util.concurrent.Callable;
    
    public class ThreadImplementsCallable implements Callable<Integer> {
        private int i;
        
        @Override
        public Integer call() throws Exception {
            for(; i < 100; i++){
                System.out.println(Thread.currentThread().getName() + " " + i);
            }
            return i;
        }
    }

    Callable接口类似于Runnable接口,但比对方强大,线程执行体为call方法,该方法具有返回值和可抛出异常。使用时将Callable对象包装为FutureTask对象,通过泛型指定返回值类型。可稍候调用FutureTask的get方法取回执行结果。

  • 相关阅读:
    12-Factor与云原生Part2
    Openshift部署流程介绍
    软件开发过程中的环境简介
    基于Openshift的SpringBoot微服务
    日志审计系统设计
    dotnetcore执行shell脚本
    12-Factor与云原生
    项目管理思考小记之一
    DevOps工程师的成长路线图
    消费者驱动的契约Consumer drivern Contract
  • 原文地址:https://www.cnblogs.com/zj2012zy/p/5300363.html
Copyright © 2011-2022 走看看