Java多线程-----创建线程的三种方式

   1.继承Thread类创建线程

  • 定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体
  • 创建Thread子类的实例,也就是创建了线程对象
  • 启动线程,即调用线程的start()方法
package com.practise.thread;

public class InheritThread extends Thread {

    @Override
    public void run() {
        for (int i = 1; i <= 20; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
   
}


package com.practise.thread;

public class ThreadTest {
    public static void main(String[] args) {
        //线程类
        InheritThread inheritThread = new InheritThread();
        inheritThread.setName("线程一");//设置线程名称
        inheritThread.start();
        
        //主线程
        Thread.currentThread().setName("主线程");        
        for (int i = 1; i <= 20; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
}

   2.实现Runnable接口创建线程

  • 定义Runnable接口的实现类,一样要重写run()方法,这个run()方法和Thread中的run()方法一样是线程的执行体
  • 创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象
  • 调用线程对象的start()方法来启动线程
package com.practise.thread;

public class ImplementRunnable implements Runnable {

    @Override
    public void run() {        
        for (int i = 1; i <= 20; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }

}


package com.practise.thread;

public class ThreadTest {
    public static void main(String[] args) {        
        //实现Runnable接口
        ImplementRunnable implementRunnable=new ImplementRunnable();
        Thread thread=new Thread(implementRunnable);
        thread.setName("线程二");
        thread.start();
        
        //主线程
        Thread.currentThread().setName("主线程");        
        for (int i = 1; i <= 20; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }                
    }
}

   3.使用Callable和Future创建线程

  • 创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)
  • 使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值
  • 使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口)
  • 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
package com.practise.createthread;

import java.util.concurrent.Callable;

public class ImplementCallable implements Callable<Integer> {

    @Override
    public Integer call() {
        Integer total = 0;
        try {
            for (int i = 1; i <= 50; i++) {
                total += i;
            }
            return total;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
}


package com.practise.createthread;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreadTest {
    public static void main(String[] args) {        
        ImplementCallable implementCallable=new ImplementCallable();
        FutureTask<Integer> task=new FutureTask<Integer>(implementCallable);
        Thread thread=new Thread(task,"有返回值的线程");
        thread.start();
        try {
            System.out.println(task.get());
        } catch (Exception ex) {
            ex.printStackTrace();
        } 
        
        Thread.currentThread().setName("主线程");        
        for (int i = 1; i <= 20; i++) {
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }                
    }
}

猜你喜欢

转载自www.cnblogs.com/fengfuwanliu/p/10082645.html