Java多线程学习一 —— 创建线程

124 阅读2分钟

多线程的定义

优势

多线程可以有效提高cpu的利用率,提高系统吞吐量

缺点

多线程环境存在数据的安全问题和资源争抢问题

线程的状态及转换

Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)。

  New:新建状态,当线程创建完成时为新建状态,即new Thread(...),还没有调用start方法时,线程处于新建状态。

  Runnable:就绪状态,当调用线程的的start方法后,线程进入就绪状态,等待CPU资源。处于就绪状态的线程由Java运行时系统的线程调度程序(thread scheduler)来调度。

  Running:运行状态,就绪状态的线程获取到CPU执行权以后进入运行状态,开始执行run方法。

  Blocked:阻塞状态,线程没有执行完,由于某种原因(如,I/O操作等)让出CPU执行权,自身进入阻塞状态。

  Dead:死亡状态,线程执行完成或者执行过程中出现异常,线程就会进入死亡状态。

image.png

创建线程的方法

原始的线程创建方法

方法一

new MyThread().start();
//普通线程创建方法
static class MyThread extends Thread{

    @Override
    public void run() {
        System.out.println("继承线程方法类创建线程");

    }
}

方法二

new Thread(new MyThread1()).start();

`

static class MyThread1 implements Runnable{

    @Override
    public void run() {
        System.out.println("实现");
    }
}

方法三

new Thread(()->{
    System.out.println("内方法创建线程");
}).start();

工具类创建线程

使用线程池创建线程

方法四

ExecutorService executorService= Executors.newCachedThreadPool();
executorService.execute(()->{
    System.out.println("线程池方法创建线程");
});
executorService.shutdown();

方法五

使用线程池,有回调方法的创建线程的方法


ExecutorService executorService2= Executors.newCachedThreadPool();
List<MyThreadCall> myThreadCalls=new ArrayList<MyThreadCall>();
myThreadCalls.add(new MyThreadCall());
List<Future<String>> future = executorService2.invokeAll(myThreadCalls);
for(Future<String> future1:future){
    System.out.println(future1.get());
}

`

//有回调的线程创建方法
static class MyThreadCall implements Callable<String> {

    @Override
    public String call() throws Exception {
        System.out.println("回调线程创建方法");
        return "success";
    }
}

image.png

使用Future 创建线程