java多线程实现的几种方式

版权声明:未经允许禁止转载 https://blog.csdn.net/weixin_38481963/article/details/86688853

基本的线程机制

    并发编程时我们可以将程序或分为多个分离的、独立运行的任务。通过多线程机制,这些独立任务中的每一个都由执行线程来驱动。

    线程可以驱动任务,因此需要一种描述任务的方式,这可以通过 Runnable 接口来提供,通过继承Runnable接口,并编写 run() 方法来定义任务。

这样就引出了,实现java多线程的第一种方式:

1.通过实现Runnable接口实现

public class MyThread implements Runnable{
    public void run(){
        System.out.println("New Thread : "+Thread.currentThread().getName());
    }
    public static void main (String []args){
        MyThread thread = new MyThread();
        Thread t = new Thread(thread);
        t.start();
        System.out.println("Main Thread : " + Thread.currentThread().getName());
    }
}

    实现Runnable接口的类,只是定义了任务,但是并没有任何内在的线程能力。所以需要通过Thread类的构造器来将任务驱动在一个线程中。

    当然还有一种更简洁的实现方式,因为Thread类已经实现了Runnable方法,所以直接继承Thread类,并复写 run() 方法,即可实现多线程。这是实现多线程的第二种方式。

2.通过继承Thread类实现

public class MyThread extends Thread{
    public void run(){
        System.out.println("New Thread : "+Thread.currentThread().getName());
    }
    public static void main (String []args){
        MyThread thread = new MyThread();
        thread.start();
        System.out.println("Main Thread : " + Thread.currentThread().getName());
    }
}

继承Thread类,然后复写 run() 方法,最后通过调用 start() 方法来启动线程。

3.通过继承Callable接口实现

import java.util.concurrent.*;

//定义任务
class Task implements Callable<String>{
    private String name;
    public Task(String name){
        this.name = name;
    }
    public String call(){
//        线程的返回值为线程的name属性值
        return name;
    }
}

public class MyThread {
    public static void main (String []args) {
        Callable<String> call = new Task("3527");
        FutureTask<String> task = new FutureTask<>(call);

        Thread t = new Thread(task);
        t.start();
//      这里暂停一下是为了等待线程执行完,以便于获取结果值,
        try{
            Thread.sleep(1000);
        }catch(Exception e){
            e.printStackTrace();
        }
        if(task.isDone()){
            try{
                System.out.println(task.get());
            }catch(InterruptedException e){
                e.printStackTrace();
            }catch(ExecutionException e){
                e.printStackTrace();
            }
        }else{
            System.out.println("task is not completed");
        }
    }
}

定义任务对象,并用FutureTask进行包装,最后同过Thread构造器来驱动该任务在新的线程中执行。

猜你喜欢

转载自blog.csdn.net/weixin_38481963/article/details/86688853