1,使用“标志”变量取消任务
//等待回调关闭锁
while (!hasreceiveSeq||seq!=receiveSeq){
sleep(1);
//yield()
//暂停当前执行的线程对象,并执行其他线程。这个暂停会放弃cpu资源,放弃的时间不确定。
if (time==500){
//执行超时任务
return;
}
time++;
}
2,线程调用者可以向线程发出中断请求,但是线程中断的权利控制在线程代码的编写者是否响应了你的中断请求。线程代码的编写者比调用者更加了解线程应不应该被停止,何时停止。
while (!Thread.currentThread().isInterrupted() && ) {}
**特殊:sleep()在响应了中断之后,清除了线程的中断状态。那么while判断时不知道线程被中断了,wait/join也会
错误的停止线程的方式:
被弃用的stop(),suspend()和resume()
使用volatile设置boolean标记位的方式,不可靠**
3,lock->wait->notify->unlock
对象的wait方法可能被不同的线程执行,所以同一个对象可能会有多个等待线程;
join()这句代码执行后会阻塞代码所在的线程。意思是哪个线程执行这句代码,哪个线程就被阻塞。
需要的锁:是子线程对象的内部锁
阻塞的线程:当前的执行线程,也就是主线程。
join阻塞主线程就是通过wait和notifyAll实现的。
stop()方法若在线程start()之前执行,那么在线程启动的时候就会立即死亡。
4.BlockingQueu.put()那么可能会出现问题,即任务可能永远不会检查取消标志。
5.线程池的submit()的返回对象Future接口有一个get()方法也可以阻塞当前线程(其实该方法主要用途是获取子线程的返回值)
6.Looper 中有一个 ThreadLocal静态字段,Looper通过它的 get 和 set 方法来赋值和取值。Looper 的作用是将 Message 对象从 MessageQueue 中取出来,并将其交给 Handler#dispatchMessage(Message) 方法,
7.void signal():唤醒一个等待在condition上的线程,将该线程从等待队列中转移到同步队列中,如果在同步队列中能够竞争到Lock则可以从等待方法中返回。
8.如果涉及到反序列化创建对象时会试着使用枚举的方式来实现单例,安卓用双重检验锁
懒汉式 私有,线程安全
9.Java 中存在一种原则——先行发生原则(happens-before)。其表示两个事件结果之间的关系:如果一个事件发生在另一个事件之间,其结果必须体现。volatile 的内存可见性就体现了该原则:对于一个 volatile 变量的写操作先行发生于后面对这个变量的读操作。
例如:当多个线程都对某一 volatile 变量(int a=0)进行 count++ 操作时,由于 count++ 操作并不是原子性操作