Java 创建并启动线程的方式 | 周末学习

本文已参与周末学习计划,点击查看详情。

1 通过继承Thread类创建线程

  • 继承 Thread
  • 重写 run() 方法
  • 通过 start() 方法启动线程
public class MutliThread extends Thread{
    private int ticket=100; //每个线程都拥有100张票
    MutliThread(String name){
        super(name); //调用父类带参数的构造方法
    }
    public void run(){
        while(ticket>0){
            System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
        }
    }
    
    public static void main(String [] args){
        MutliThread m1=new MutliThread("Window 1");
        m1.start();
    }
}
复制代码

2 通过实现Runnable接口创建线程

  • 实现 Runnable 接口
  • 实现 run() 方法
  • Runnable 对象提交给 Thread 构造器,创建一个 Thread 对象
  • 通过 Thread 对象调用 start() 方法启动线程
public class MutliThread implements Runnable{
    private int ticket=100;//每个线程都拥有100张票
    private String name;
    
    MutliThread(String name){
        this.name=name;
    }
    
    public void run(){
        while(ticket>0){
            System.out.println(ticket--+" is saled by "+name);
        }
    }
    
    public static void main(String [] args){
        MutliThread m1=new MutliThread("Window 1");
        Thread t1=new Thread(m1);
        t1.start();
    }
}
复制代码

3 通过实现Callable接口创建线程

  • 实现Callable接口,需要返回值类型
  • 重写call方法,需要抛出异常
  • 创建目标对象
  • 创建执行服务:ExecutorService ser = Executors.newFixedThreadPool(1);
  • 提交执行:Futureresult1 = ser.submit(t1);
  • 获取结果:boolean r1 = result1.get()
  • 关闭服务:ser.shutdowmNow();
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableAndFuture {
    static class MyThread implements Callable<String> {
        @Override
        public String call() throws Exception {
            return "Hello world";
        }
    }

    public static void main(String[] args) {
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        Future<String> future = threadPool.submit(new MyThread());

        try {
            System.out.println(future.get());
        } catch (Exception e) {

        } finally {
            threadPool.shutdown();
        }
    }
}
复制代码

4 run() 与 start() 的区别

  • 通过调用 Thread 类的 start() 方法来启动一个线程,这时此线程处于 RUNNABLE 状态,并没有运行,一旦得到 cpu 时间片,就开始执行 run() 方法,这里方法 run() 称为线程体,它包含了要执行的这个线程的内容,run() 方法运行结束,此线程随即终止。
  • run() 方法只是类的一个普通方法而已,如果直接调用 run() 方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待 run() 方法体执行完毕后才可继续执行下面的代码,没有达到多线程的目的。
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享