interrupt:用于中断线程。调用该方法的线程的状态为将被置为”中断”状态。 注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处 理。支持线程中断的方法(也就是线程中断后会抛出interruptedException 的方法)就是在监视线程的 中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。
interrupted:是静态方法,查看当前中断信号是true还是false并且清除中断信号。如果一个线程 被中断了,第一次调用 interrupted 则返回 true,第二次和后面的就返回 false 了。
isInterrupted:是可以返回当前中断信号是true还是false,与interrupt最大的差别
36. 如何停止一个正在运行的线程?在java中有以下3种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期 作废的方法。 使用interrupt方法中断线程。
37. 什么是阻塞式方法?阻塞式方法是指程序会一直等待该方法完成期间不做其他事情,ServerSocket 的accept()方法就是 一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后 才会返回。此外,还有异步和非阻塞式方法在任务完成前就返回。
38. Java 中你怎样唤醒一个阻塞的线程?首先 ,wait()、notify() 方法是针对对象的,调用任意对象的 wait()方法都将导致线程阻塞,阻塞 的同时也将释放该对象的锁,相应地,调用任意对象的 notify()方法则将随机解除该对象阻塞的线 程,但它需要重新获取该对象的锁,直到获取成功才能往下执行; 其次,wait、notify 方法必须在 synchronized 块或方法中被调用,并且要保证同步块或方法的锁 对象与调用 wait、notify 方法的对象是同一个,如此一来在调用 wait 之前当前线程就已经成功获 取某对象的锁,执行 wait 阻塞后当前线程就将之前获取的对象锁释放。
39. notify() 和 notifyAll() 有什么区别?如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去 竞争该对象的锁。 notifyAll() 会唤醒所有的线程,notify() 只会唤醒一个线程。 notifyAll() 调用后,会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行, 如果不成功则留在锁池等待锁被释放后再次参与竞争。而 notify()只会唤醒一个线程,具体唤醒哪 一个线程由虚拟机控制。
40. 如何在两个线程间共享数据?在两个线程间共享变量即可实现共享。 一般来说,共享变量要求变量本身是线程安全的,然后在线程内使用的时候,如果有对共享变量的复合操作,那么 也得保证复合操作的线程安全性。
41. Java 如何实现多线程之间的通讯和协作?可以通过中断 和 共享变量的方式实现线程间的通讯和协作 比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放 入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不 释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产 者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用 权,并进入挂起状态。然后等待消费者消费了商品,然后消费者通知生产者队列有空间了。同样 地,当队列空时,消费者也必须等待,等待生产者通知它队列中有商品了。这种互相通信的过程就 是线程间的协作。
Java中线程通信协作的最常见方式:
一.syncrhoized加锁的线程的Object类的wait()/notify()/notifyAll()
二.ReentrantLock类加锁的线程的Condition类的await()/signal()/signalAll() 线程间直接的数据交换:
三.通过管道进行线程间通信:字节流、字符流
42. 同步方法和同步块,哪个是更好的选择?同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会 锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获 得这个对象上的锁。 同步块更要符合开放调用的原则,只在需要锁住的代码块锁住相应的对象,这样从侧面来说也可以 避免死锁。
43. 什么是线程同步和线程互斥?请知道一条原则:同步的范围越小越好
当一个线程对共享的数据进行操作时,应使之成为一个”原子操作“,即在没有完成相关操作之前, 不允许其他线程打断它,否则,就会破坏数据的完整性,必然会得到错误的处理结果,这就是线程 的同步。
在多线程应用中,考虑不同线程之间的数据同步和防止死锁。当两个或多个线程之间同时等待对方 释放资源的时候就会形成线程之间的死锁。为了防止死锁的发生,需要通过同步来实现线程安全。
线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用 某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到 占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。
线程间的同步方法大体可分为两类:用户模式和内核模式。顾名思义,内核模式就是指利用系统内 核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核 态,只在用户态完成操作。 用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。
内核模式下的方法有:事 件,信号量,互斥量。
44 实现线程同步的方法有哪几种实现方式?- 同步代码方法:sychronized 关键字修饰的方法
- 同步代码块:sychronized 关键字修饰的代码块
- 使用特殊变量域volatile实现线程同步:volatile关键字为域变量的访问提供了一种免锁机制
- 使用重入锁实现线程同步:reentrantlock类是可冲入、互斥、实现了lock接口的锁他与 sychronized方法具有相同的基本行为和语义



