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

    1. 继承Thread类 (Thread类实现了Runnable接口:public class Thread implements Runnable)
    2. 实现Runnable接口
    3. 使用Callable和Future

    实例代码:
    1. 继承Thread类

    public class MyThreadDemo {
        public static void main(String[] args) {
            MyThread thread = new MyThread();
            thread.start();
        }
    }
    
    class MyThread extends Thread{
        @Override
        public void run(){
            //run方法
        }
    }

    2. 实现Runnable接口
    (1) 方法一

    public class MyThreadDemo {
        public static void main(String[] args) {
            Thread thread = new Thread(new Runnable(){
                @Override
                public void run(){
                    //run方法
                }
            });
            thread.start();
        }
    }

    (2) 方法二

    public class MyThreadDemo {
        public static void main(String[] args) {
            Runner one = new Runner();
            Thread thread = new Thread(one); //都是接收了一个实现了Runnable的对象
            thread.start();
        }
    }
    
    class Runner implements Runnable{
        @Override
        public void run(){
            //run方法
        }
    }

    3. 使用Callable和Future
    和Runnable接口不一样,Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能要强大。
    (1). call()方法可以有返回值
    (2). call()方法可以声明抛出异常

    创建并启动有返回值的线程的步骤如下:

    1】创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)。

    2】使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值

    3】使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口)

    4】调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    
    public class CreateThread {
    
        public static void main(String[] args) throws InterruptedException, ExecutionException {
    
            // 第三种方式
            FutureTask<String> ft = new FutureTask<String>(new Callable<String>() {
    
                @Override
                public String call() throws Exception {
                    System.out.println("new Thread 3");// 输出:new Thread 3
                    return "aaaa";
                }
            });
    
            Thread t3 = new Thread(ft);
            t3.start();
            String result = ft.get();
            System.out.println(result);// 输出:aaaa
        }
    }

    三种创建线程方式对比
    实现Runnable和实现Callable接口的方式基本相同,不过是后者执行call()方法有返回值,前者线程执行体run()方法无返回值,因此可以把这两种方式归为一种,这两种方式与继承Thread类的方法之间的差别如下:

    1、线程只是实现Runnable或实现Callable接口,还可以继承其他类。

    2、这种方式下,多个线程可以共享一个target对象,非常适合多线程处理同一份资源的情形。

    3、如果需要访问当前线程,必须调用Thread.currentThread()方法。

    4、继承Thread类的线程类不能再继承其他父类(Java单继承决定)。

    注:一般推荐采用实现接口的方式来创建多线程


    参考:
    https://www.cnblogs.com/3s540/p/7172146.html

  • 相关阅读:
    SQL将表中某一类型的一列拼接成一行
    javascript中把一个数组的内容全部赋值给另外一个数组
    Socket接口原理及用C#语言实现
    Linq表连接大全(INNER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN、CROSS JOIN)
    C#中对DataTable进行全连接后group by,orderby
    循环删除DataTable.Row中的多行问题
    跨库连接报错Server 'myLinkedServer' is not configured for RPC
    执行远程存储过程并插入到临时表中
    无法定位程序输入点_ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEPKcj于动态链接库上
    Qt 日期时间
  • 原文地址:https://www.cnblogs.com/zeroingToOne/p/9064123.html
Copyright © 2011-2022 走看看