多线程的定义
优势
多线程可以有效提高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:死亡状态,线程执行完成或者执行过程中出现异常,线程就会进入死亡状态。
创建线程的方法
原始的线程创建方法
方法一
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";
}
}