interrupt方法中断线程

如果线程需要执行一个长时间任务,就可能需要能中断线程。中断线程就是其他线程给该线程发一个信号,该线程收到信号后结束执行run()方法,使得自身线程能立刻结束运行。 我们举个栗子:假设从网络下载一个100M的文件,如果网速很慢,用户等得不耐烦,就可能在下载过程中点“取消”,这时,程序就需要中断下载线程的执行。 中断一个线程非常简单,只需要在其他线程中对目标线程调用interrupt()方法,目标线程
interrupt方法中断线程

守护线程详解

Java程序入口就是由JVM启动main线程,main线程又可以启动其他线程。当所有线程都运行结束时,JVM退出,进程结束。 如果有一个线程没有退出,JVM进程就不会退出。所以,必须保证所有线程都能及时结束。 但是有一种线程的目的就是无限循环,例如,一个定时触发任务的线程: class TimerThread extends Thread { @Override public void run()
守护线程详解

多线程同步控制详解

当多个线程同时运行时,线程的调度由操作系统决定,程序本身无法决定。因此,任何一个线程都有可能在任何指令处被操作系统暂停,然后在某个时间段后继续执行。 这个时候,有个单线程模型下不存在的问题就来了:如果多个线程同时读写共享变量,会出现数据不一致的问题。 我们来看一个例子: // 多线程 public class Main { public static void main(String args
多线程同步控制详解

synchronized关键词实现现线程步详解

我们知道Java程序依靠synchronized对线程进行同步,使用synchronized的时候,锁住的是哪个对象非常重要。 让线程自己选择锁对象往往会使得代码逻辑混乱,也不利于封装。更好的方法是把synchronized逻辑封装起来。例如,我们编写一个计数器如下: public class Counter { private int count = 0; public void add(int
synchronized关键词实现现线程步详解

线程死锁详解

Java的线程锁是可重入的锁。 什么是可重入的锁?我们还是来看例子: public class Counter { private int count = 0; public synchronized void add(int n) { if (n < 0) { dec(-n); } else { count += n; } } public synchronized void dec(in
线程死锁详解

wait和notify方法实现多线程的等待和通知

在Java程序中,synchronized解决了多线程竞争的问题。例如,对于一个任务管理器,多个线程同时往队列中添加任务,可以用synchronized加锁: class TaskQueue { Queue<String> queue = new LinkedList<>(); public synchronized void addTask(String s) { thi
wait和notify方法实现多线程的等待和通知

可重入锁ReentrantLock详解

从Java 5开始,引入了一个高级的处理并发的java.util.concurrent包,它提供了大量更高级的并发功能,能大大简化多线程程序的编写。 我们知道Java语言直接提供了synchronized关键字用于加锁,但这种锁一是很重,二是获取时必须一直等待,没有额外的尝试机制。 java.util.concurrent.locks包提供的ReentrantLock用于替代synchronize
可重入锁ReentrantLock详解

Condition接口实现线程的等待和通知

使用ReentrantLock比直接使用synchronized更安全,可以替代synchronized进行线程同步。 但是,synchronized可以配合wait和notify实现线程在条件不满足时等待,条件满足时唤醒,用ReentrantLock我们怎么编写wait和notify的功能呢? 答案是使用Condition对象来实现wait和notify的功能。 我们仍然以TaskQueue为例
Condition接口实现线程的等待和通知