并发编程(壹):创建线程的三种方式及其对比

创建线程的三种方式及其对比


1. 继承 Thread类

(1). 继承Thread类。并重写run()方法,该方法无参数,无返回值;

(2). 创建子类实例,并实例化对象;

(3). 通过start()方法启动,注意:不是通过run()方法启动。

public class ThreadDemo extends Thread{
    public void run(){
        System.out.println("继承Thread创建线程的.");
    }
}

public class ThreadAction {
    public static void main(String[] args) {
        Thread threadDemo=new ThreadDemo();
        threadDemo.start();
    }
}

2. 实现Runnable接口

(1). 实现Runnable接口,并重新run()方法;

(2). 创建Runnable实现类的实例,并用这个实例作为Thread的target创建线程对象;

(3). 通过start()启动线程。

public class RunnableDemo implements Runnable{

    @Override
    public void run() {
        System.out.println("实现Runnable创建线程的.");
    }
}

public class ThreadAction {
    public static void main(String[] args) {
        RunnableDemo runnableDemo = new RunnableDemo();
        Thread thread = new Thread(runnableDemo);
        thread.start();
    }
}

3. 通过Callable和Future创建线程

产生背景:这种创建线程的方式在jdk1.5后出现,目的是弥补上面两种创建线程方式,其中的run()方法不能有返回值,不能抛出异常等问题。

(1). 创建实现Callable的实现类,并实现call()方法;

(2). 创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象);

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

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

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

public class CallableDemo implements Callable<String> {

    @Override
    public String call() throws Exception {
        return "hello ,我是通过实现Callable接口的方式创建线程。";
    }
}

public class ThreadAction {
    public static void main(String[] args) {
        CallableDemo callableDemo = new CallableDemo();
        // 使用FutureTask类来包装Callable对象
        FutureTask<String> stringFutureTask = new FutureTask<>(callableDemo);
        Thread thread = new Thread(stringFutureTask);
        thread.start();
        try {
            System.out.println(stringFutureTask.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

4. 创建线程的三种方式的对比

实现Runnable、Callable接口的方式创建多线程

  • 优势:该线程只是实现了接口,还可以继承其他类.在这种方式下多个线程共享一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想.
  • 劣势:编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。

继承Thread类

  • 优势:代码编写简单,当前Thread可用this获取.
  • 劣势:继承Thread类,不可继承其他类.

原文地址:https://www.cnblogs.com/xzy-/p/10921288.html

时间: 05-23

并发编程(壹):创建线程的三种方式及其对比的相关文章

java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方

java创建线程的三种方式及其对照

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类.并重写该类的run方法,该run方法的方法体就代表了线程要完毕的任务.因此把run()方法称为运行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法.run方法的方

创建线程的三种方式

创建线程的三种方式 第一种:通过NSThread的对象方法 第二种:通过NSThread的类方法 第三种:通过NSObject的方法 准备在后台线程调用的方法 longOperation: - (void)longOperation:(id)obj { NSLog(@"%@ - %@", [NSThread currentThread], obj); } 方式1:alloc / init - start - (void)threadDemo1 { NSLog(@"before

JAVA并发编程学习笔记------线程的三种创建方式

创建线程一般有如下几个方式: 1. 通过继承Thread类来创建一个线程: /** * 步骤1:定义一个继承Thread类的子类 * 步骤2:构造子类的一个对象 * 步骤3:启动线程: * */ public class ThreadTest{ public static void main(String[] args) { //构造子类对象 SubThread subThread = new SubThread(); //启动线程 subThread.start(); } } //定义继承Th

创建线程的三种方式浅析

方式1,继承Thread: new Thread() { public void run() { System.out.println("hello world"); } }.start(); 方式2,实现Runnable接口: new Thread(new Runnable() { @Override public void run() { System.out.println("hello world"); } }).start(); 方式3,实现Callabl

Java创建线程的三种方式

1.继承Runnable接口 package test; class RunnableDemo implements Runnable{ private Thread t; private String threadName; RunnableDemo(String name){ threadName=name; System.out.println("Creating "+name); } public void run(){ System.out.println("Run

《多线程编程》——创建线程的两种方式

1.目的 创建线程,即拿到一个线程实例.这个线程实例必须具备开启.等待.唤醒等控制自身生命周期的方法. 2.创建Thread线程 方式一:new Thread().new Thread(String name) 1 /** 2 *两个构造器也有区别:线程名不同 3 */ 4 public class Thread implements Runnable { 5 private char name[]; 6 7 //1.不带参 8 /* 9 *Automatically generated nam

Java并发编程-创建线程的两种方式及区别

转载请注明:http://blog.csdn.net/UniKylin/article/details/45016117 1.线程和进程的区别 并行:是多个任务在同一时间同时执行,例如多核计算机同时计算的任务可以理解为并行 并发:从微观上看是多个任务抢占一个CPU从而执行自己的任务,轮流执行任务,但是如果遇到资源冲突的时候并没有从根本提高执行效率.但是提高了CPU的使用效率. 前段时间在GitHub上的一幅图可以很好的阐述上面的概念非常形象 2.Java中创建线程的两种方式 1.第一种方式:直接

线程的状态以及创建多线程的三种方式

首先了解一下线程的五种状态: 新建状态: 新建状态是指new之后,即新创建了一个线程的时候,此时并未运行任何线程方法体内的程序代码. 就绪状态: 简单来说就是指程序调用了start()之后,线程就得到了启动,代表线程进入了就绪状态,但是此时并不代表它会立刻去执行run()方法体内的程序代码,而是随时等待cpu的调度. 运行状态: 获得cpu的时间后,调用run()方法,进入运行状态. 阻塞状态: 由于某种原因放弃了cpu的会用权力,暂时停止运行,等待再次被调用. 死亡状态: 线程正常执行完毕,或