随笔 ① 关于java线程 --- 创建线程的方法

java提供了三种创建线程的方法:

  • 通过继承 Thread 类本身;
  • 通过实现 Runnable 接口;
  • 通过 Callable 和 Future 创建线程。

方法一:通过继承Thread类

① 定义Thread类的子类,并重写该类的run()方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。

② 创建Thread子类的实例,即创建线程对象。

③ 调用线程对象的start()方法来启动该线程。

示例:

package com.thread;

public class FirstThreadTest extends Thread{

int i = 0;

//重写run方法,run方法的方法体就是现场执行体

public void run(){

for(;i < 100;i ++){

System.out.println(getName() + " " + i);

}

}

public static void main(String[] args) {

for(int i = 0;i < 100;i ++){

System.out.println(Thread.currentThread().getName() + " : " + i);

if(i == 20){

new FirstThreadTest().start();//创建实例对象,并调用start方法启动线程

new FirstThreadTest().start();

}

}

}

}

方法二:通过实现Runnable接口

① 定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

② 创建 Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

③ 调用线程对象的start()方法来启动该线程。

示例:

package com.thread;

public class RunnableThreadTest implements Runnable{

private int i;

public void run(){

for(i = 0;i < 100;i ++){

System.out.println(Thread.currentThread().getName() + " " + i);

}

}

public static void main(String[] args){

for(int i = 0;i < 100;i ++){

System.out.println(Thread.currentThread().getName() + " " + i);

if(i == 20){

RunnableThreadTest rtt = new RunnableThreadTest();//创建实例对象

new Thread(rtt,"新线程1").start();//将实现类的对象作为Thread类的参数,创建线程对象,并启动线程

new Thread(rtt,"新线程2").start();

}

}

}

}

方法三:通过Callable和Future创建线程

① 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

② 创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

③ 使用FutureTask对象作为Thread对象的target创建并启动新线程。

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

示例:

package com.thread;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.FutureTask;

public class CallableThreadTest implements Callable<Integer>{//实现接口

public static void main(String[] args){

CallableThreadTest ctt = new CallableThreadTest();

FutureTask<Integer> ft = new FutureTask<>(ctt);//使用FutureTask包装CallableThreadTest对象

for(int i = 0;i < 100;i ++){

System.out.println(Thread.currentThread().getName()+" 的循环变量i的值"+i);

if(i == 20){

new Thread(ft,"有返回值的线程").start();//将FutureTask对象作为Thread构造方法的target,并启动线程

}

}

try{

System.out.println("子线程的返回值:"+ft.get());//使用FutureTask的get方法获取子线程call()方法执行的返回值

} catch (InterruptedException e){

e.printStackTrace();

} catch (ExecutionException e){

e.printStackTrace();

}

}

@Override

public Integer call() throws Exception{//重写Callable接口的call()方法

int i = 0;

for(;i < 100;i ++){

System.out.println(Thread.currentThread().getName()+" "+i);

}

return i;

}

}

【总结】三种创建线程方法的对比

  • 采用实现Runnable、Callable接口的方式创见多线程时:

    • 优势是:线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
    • 在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
  • 劣势是:

    • 编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。
  • 使用继承Thread类的方式创建多线程时优势是:

    • 编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。
  • 劣势是:

    • 线程类已经继承了Thread类,所以不能再继承其他父类。
时间: 2024-08-28 19:17:30

随笔 ① 关于java线程 --- 创建线程的方法的相关文章

Java多线程--创建线程

1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); public Thread(Runnable target); public Thread(String name); public Thread(Runnable target, S

java中创建线程的三种方法以及区别

Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.Java可以用三种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3)使用Callable和Future创建线程 下面让我们分别来看看这三种创建线程的方法. ------------------------继承Thread类创建线程--------------------- 通过继承Thread类来创建并启动多线程的一般步骤如下 1]d定义Thread类的子类

JAVA中创建线程的方法及比较

JAVA中提供了Thread类来创建多线程的应用,常用的方式有以下2种. 一.实现Runnable接口来创建线程 1.创建一个任务类,实现Runnable接口,并重写run()方法,run()方法中的内容就是需要线程完成的任务. 2.创建一个任务类的对象. 3.任务类必须在线程中执行,因此将任务类的对象作为参数,创建一个Thread类对象,该Thread类对象才是真正的线程对象. 4.调用Thread线程类对象的start()方法,来启动一个线程. 代码实例: 1 public class Te

java中创建线程的3种方法

1.继承Thread类优点:可以直接使用Thread类中的方法,代码比较简单.缺点:继承Thread类之后不能继承其他类. 2.实现Runable接口优点:实现接口,比影响继承其他类或实现接口.缺点: 3.实现Callable接口优点:可以获取返回值,可以抛出异常.缺点:实现方法相对复杂 三种方法的实现例 public static void main(String[] args) throws InterruptedException, ExecutionException { //继承Thr

Java多线程——创建线程的两种方式

创建线程方式一:继承Thread类. 步骤:1,定义一个类继承Thread类.2,覆盖Thread类中的run方法.3,直接创建Thread的子类对象创建线程.4,调用start方法开启线程并调用线程的任务run方法执行. 可以通过Thread的getName获取线程的名称 Thread-编号(从0开始)主线程的名字就是main. 例: class Demo extends Thread { private String name; Demo(String name) { super(name)

java多线程---创建线程的几种方式

创建线程的几种方式 在并发编程中,创建线程是我们经常会做的事情,那么一般来说,创建线程有4种方式: 1.继承Thread类. 2.实现Runnable接口. 3.实现Callable接口,结合FutureTask来使用. 4.利用线程池的方式来实现. 继承Thread创建线程 public class ThreadTest1 extends Thread { @Override public void run() { try { Thread.sleep(1000); } catch (Inte

Java中创建线程的两种方式

1.定义实现Runnable接口的线程类,步骤如下: (1)创建实现了Runnable接口的线程类Runner: (2)重写Runnable接口的run()方法,用于定义线程的运行体:(Runnable接口只有这一个方法) (3)实例化线程类Runner: (4)创建线程实例,并将线程类Runner的实例传递给它作为构造函数的参数: (5)启动线程: 代码如下所示: 1 public class TestThread { 2 public static void main(String args

Java中创建线程用第几种方式

2015年11月19日10:16:33 作者:数据分析玩家 //用第一种方法创建线程:每个线程处理的是不同的资源//每个线程分别对应20张电影票,之间并无任何关系,这就说明每个线程之间是平等的,没有优先级关系class Tc extends Thread { private int tickets = 20;//每个线程各自卖20张票 public String name ; public Tc(String name) { this.name = name; } public void run

猎豹MFC--进程和线程--创建线程AfxBeginThread() SetDlgItemInt()线程暂停继续终止

增加一按钮  双击: SPY++查看  进程下面的线程: 另一个线程函数: 定义一个指针变量: 在构造函数中初始化: 暂停线程: 线程继续: 定义布尔变量 记录 线程有没有在运行: 初始化该变量: 修改县城函数demoA: 对话框添加按钮,双击该按钮: 增加一个线程函数: 实现线程函数: 增加第2个按钮  掉用第二个线程函数:' 按了第一个按钮立马按第二个按钮时  也就是当两个线程并发执行时就会出错: 以上是线程同步的四种方法,是MFC的C++类 定义指针:指向临界区对象: 在构造函数中 创建临