欢迎光临
我们一直在努力

Java 并发编程:创建线程四种方式对比

img

区别:

  • Thread 单继承受限;
  • Runnable 无返回值;
  • Callable 有返回值、可抛异常;
  • 线程池可控、安全、高性能,是生产环境标准。

线程创建的方式

共有四种方式可以创建线程,分别是:继承Thread类、实现runnable接口、实现Callable接口、线程池创建线程

详细创建方式参考下面代码:

① 继承Thread类

步骤:

  • 类继承 Thread
  • 重写 run ()
  • 创建对象,调用 start ()

优点: 简单

缺点: Java 单继承,无法再继承其他类,扩展性差。

public class MyThread extends Thread {

@Override
public void run() {
System.out.println("MyThread…run…");
}

public static void main(String[] args) {

// 创建MyThread对象
MyThread t1 = new MyThread() ;
MyThread t2 = new MyThread() ;

// 调用start方法启动线程
t1.start();
t2.start();

}
}

② 实现runnable接口

步骤:

  • 实现 Runnable
  • 重写 run ()
  • 传入 Thread 构造方法

优点: 接口多实现,不影响继承,灵活。

缺点:无返回值,无法抛异常。

public class MyRunnable implements Runnable{

@Override
public void run() {
System.out.println("MyRunnable…run…");
}

public static void main(String[] args) {

// 创建MyRunnable对象
MyRunnable mr = new MyRunnable() ;

// 创建Thread对象
Thread t1 = new Thread(mr) ;
Thread t2 = new Thread(mr) ;

// 调用start方法启动线程
t1.start();
t2.start();

}

}

③ 实现Callable接口

特点:

  • 重写call方法,有返回值
  • 可以抛出异常
  • 结合 FutureTask 使用

优点:有返回值、可抛异常。

缺点:稍复杂。

public class MyCallable implements Callable<String> {

@Override
public String call() throws Exception {
System.out.println("MyCallable…call…");
return "OK";
}

public static void main(String[] args) throws ExecutionException, InterruptedException {

// 创建MyCallable对象
MyCallable mc = new MyCallable() ;

// 创建F
FutureTask<String> ft = new FutureTask<String>(mc) ;

// 创建Thread对象
Thread t1 = new Thread(ft) ;
Thread t2 = new Thread(ft) ;

// 调用start方法启动线程
t1.start();

// 调用ft的get方法获取执行结果
String result = ft.get();

// 输出
System.out.println(result);

}

}

④ 线程池创建线程(一般项目里)

特点:

  • 阿里开发规范:禁止使用 Executors,必须用 ThreadPoolExecutor!
  • 同样实现 Runnable接口

优点:

  • 控制线程数量
  • 避免频繁创建销毁线程
  • 提升性能、防止 OOM企业开发必须用线程池!
  • 线程池可控、安全、高性能,是生产环境标准。

public class MyExecutors implements Runnable{

@Override
public void run() {
System.out.println("MyRunnable…run…");
}

public static void main(String[] args) {

// 创建线程池对象
ExecutorService threadPool = Executors.newFixedThreadPool(3);
threadPool.submit(new MyExecutors()) ; //提交任务

// 关闭线程池
threadPool.shutdown();

}

}

参考回答

在java中一共有四种常见的创建方式,分别是:继承Thread类、实现runnable接口、实现Callable接口、线程池创建线程。通常情况下,我们项目中都会采用线程池的方式创建线程。

runnable 和 callable 有什么区别

参考回答

  • Runnable 接口run方法没有返回值;Callable接口**call方法有返回值,**是个泛型,和Future、FutureTask配合可以用来获取异步执行的结果
  • Callalbe接口支持返回执行结果,需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞。
  • Callable接口的call()方法允许抛出异常;而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛
  • 线程的 run()和 start()有什么区别?

    start(): 用来启动线程,通过该线程调用run方法执行run方法中所定义的逻辑代码,只能被调用一次。

    run(): 封装了要被线程执行的代码,可以被调用多次。

    赞(0)
    未经允许不得转载:171主机测评 » Java 并发编程:创建线程四种方式对比
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址