java中多线程实现方式

  java中线程是常常会提到的问题,可是实际开发工做却又不多用的技术(起码本人用的比较少)。下面介绍几种常见的线程实现方式java

  一、继承Thread类,重写run方法多线程

   咱们经过集成Thread类并经过重写run方法的方式实现线程,而后经过start方法启动线程ide

  

public class MyThread extends Thread{

    @Override
    public void run() {
        System.out.println("================"+new Date());
    }

    public static void main(String[] args) {
        for(int i=0;i<10;i++){
            MyThread myThread = new MyThread();
            myThread.start();
        }
    }
}

运行main方法测试效果:测试

 

  二、经过实现Runable接口的方式this

  Thread做为java中的线程类,其有一个Runable做为构造参数的构造方法,咱们能够经过实现Runable接口,从而进一步实现线程。一样是经过start启动线程。spa

/**
 * 经过实现Runable接口
 */
public class MyRunableImpl implements Runnable{

    private String name;

    public MyRunableImpl(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        System.out.println(name+"================"+new Date());
    }

    public static void main(String[] args) {
        for(int i=0;i<10;i++){
            MyRunableImpl myRunable = new MyRunableImpl("myRunable"+i);
            Thread t = new Thread(myRunable);
            t.start();
        }
    }
}

运行main方法测试效果:线程

 

   三、经过FutureTask实现线程3d

  此方式和第二种方式有点像,仍是使用Thread(Runnable)构造方法,区别在于此处不用本身实现Runable,而是使用FutureTask。FutureTask实现了code

RunnableFuture接口,而RunnableFuture接口又集成了Runable接口,因此咱们也能够使用FutureTask作为构造参数建立线程。FutureTask支持两种有参的构造方法,此处咱们使用Future(Callable)。首先,咱们须要建立一个类,该类须要实现Callable接口,实现call方法。对象

public class MyCallable implements Callable {

    private String name;

    public MyCallable(String name) {
        this.name = name;
    }

    @Override
    public Object call() throws Exception {
        System.out.println(name+"==============="+new Date());
        return name;
    }
}

测试类

public class FutureTaskTest {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        for(int i=0;i<10;i++){
            MyCallable myCallable = new MyCallable("myCallable"+i);
            FutureTask futureTask = new FutureTask(myCallable);
            Thread t = new Thread(futureTask);
            t.start();
            Object o = futureTask.get();
            System.out.println("return value============"+o);
        }
    }
}

运行main方法测试效果:

 

 在线程启动时会调用Callable接口的call方法。咱们能够经过FutureTask.get()方法获取call()的返回值。须要注意的是get方法会阻塞线程。

  四、使用Executors建立线程池

  Executors是java juc中的类,咱们能够经过其建立线程池,并以此实现线程。此方式一样须要一个Callable的实现类,此处咱们仍是使用第3中方法中的类。

public class ExecutorsTest {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        List<Future<?>> list = new ArrayList<>();
        for(int i=0;i<10;i++){
            MyCallable myCallable = new MyCallable("myCallable"+i);
            Future submit = executorService.submit(myCallable);
            list.add(submit);
        }
        for(Future future:list){
            try {
                Object o = future.get();
                System.out.println("return value============="+o);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        executorService.shutdown();
    }
}

咱们经过Executors建立线程池,ExecutorService.submit(Callable)启动线程。submit方法会返回一个Future对象,经过其get()方法能够获取Callable实现类的call方法返回值。执行完上述操做后须要调用ExecutorService.shutdown方法,否则主线程会一直处于运行状态。

执行main方法测试效果:

 

 以上就是常见的建立多线程的几种方式。若是不对,对应你们评论留言。

相关文章
相关标签/搜索