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方法取回执行结果。

  • 相关阅读:
    Golang-字符串常用的系统函数
    35.HTML--网页自动跳转 5种方法
    34.js----JS 开发者必须知道的十个 ES6 新特性
    33. 禁止鼠标右键保存图片、禁止拖动图片
    32.js 判断当前页面是否被浏览
    31.JS实现控制HTML5背景音乐播放暂停
    30.get和post的区别
    29.html5 移动端开发总结
    28.json数组,select选择,input输出对应数据
    27.给input边框和背景颜色设置全透明
  • 原文地址:https://www.cnblogs.com/zj2012zy/p/5300363.html
Copyright © 2011-2022 走看看