Java中的多线程
1.引言
什么时进程:
进程对于计算机就是一个独立的程序,例如QQ 、微信、谷歌浏览器等
什么是线程:
每一个进程中包含很多不同的功能,例如QQ中包含聊天、语音、视频等不同的功能,这些功能就是一个个的线程
什么是时间片:
时间片”是分时操作系统分配给每个正在运行的进程微观上的一段CPU时间(在抢占内核中是:从进程开始运行直到被抢占的时间)。现代操作系统允许同时运行多个进程 —— 例如,你可以在打开音乐播放器听音乐的同时用浏览器浏览网页并下载文件。事实上,虽然一台计算机通常可能有多个CPU,但是同一个CPU永远不可能真正地同时运行多个任务。在只考虑一个CPU的情况下,这些进程“看起来像”同时运行的,实则是轮番穿插地运行,由于时间片通常很短,用户不会感觉到。
多线程
2. Java中的多线程
2.1 java中的多线程
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程1执行的任务");
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程2执行的任务");
}
});
thread1.start();
thread2.start();
}
2.2 线程安全
当多个线程同时对一个数据进行操作时,需要考虑线程安全,例如,用户1的钱只够买一件商品,在线程1执行买商品同时,查询金钱足够购买上篇,此时线程2开始执行买商品,此时金钱尚未扣除,线程2发现金钱足够,依旧执行,就会发生一份钱买两份商品的情况。
Java中使用synchronized (mutex)加锁的方式来解决类似问题,被加所的方法在只允许一个线程对象执行,一旦有一个线程执行代码块的内容,其他线程进入阻塞等待状态
class MyRunnable implements Runnable{
@Override
public void run() {
synchronized ("锁对象"){
System.out.println("进行加锁的代码");
}
}
}
Thread thread = new Thread(new MyRunnable());
thread.start();
2.3 synchronized (mutex) 中mutex锁对象的作用
当生产者线程和消费者线程同时对一个商品进行操作时,防止出现生产过多或者货不应求的情况,需要对两个线程的共同资源进行一个联系,即当商品充足时消费者线程工作,当商品不足时生产者线程工作。因此,使用商品对象作为同步代码块的锁对象,将两个线程进行通信
3.线程池
使用线程池,对线程进行统一管理,减少线程的创建与销毁操作,从而提高效率
3.1相关方法
//创建线程池,初始线程容量为5
ExecutorService threadPool = Executors.newFixedThreadPool(5);
//提交任务
threadPool.submit(() -> System.out.println(Thread.currentThread().getName() + " : Lambda表达式提交线程任务"));
//关闭线程池,保留正在执行的线程对象
threadPool.shutdown();
//关闭线程池,释放所有线程对象
threadPool.shutdownNow();