1、什么导致线程阻塞
一般线程中的阻塞:
A、线程执行了Thread.sleep(int millsecond);方法,当前线程放弃CPU,睡眠一段时间,然后再恢复执行
B、线程执行一段同步代码,但是尚且无法获得相关的同步锁,只能进入阻塞状态,等到获取了同步锁,才能回复执行。
C、线程执行了一个对象的wait()方法,直接进入阻塞状态,等待其他线程执行notify()或者notifyAll()方法。
D、线程执行某些IO操作,因为等待相关的资源而进入了阻塞状态。比如说监听system.in,但是尚且没有收到键盘的输入,则进入阻塞状态。
Socket客户端的阻塞:
A、请求与服务器连接时,调用connect方法,进入阻塞状态,直至连接成功。
B、当从Socket输入流读取数据时,在读取足够的数据之前会进入阻塞状态。比如说通过BufferedReader类使用readLine()方法时,在没有读出一行数据之前,数据量就不算是足够,会处在阻塞状态下。
C、调用Socket的setSoLinger()方法关闭了Socket延迟,当执行Socket的close方法时,会进入阻塞状态,知道底层Socket发送完所有的剩余数据
Socket服务器的阻塞:
A、线程执行ServerSocket的accept()方法,等待客户的连接,知道接收到客户的连接,才从accept方法中返回一个Socket对象
B、从Socket输入流读取数据时,如果输入流没有足够的数据,就会进入阻塞状态
D、线程向Socket的输出流写入一批数据,可能进入阻塞状态
当程序阻塞时,会降低程序的效率,于是人们就希望能引入非阻塞的操作方法。
所谓非阻塞方法,就是指当线程执行这些方法时,如果操作还没有就绪,就立即返回,不会阻塞着等待操作就绪。Java.nio 提供了这些支持非阻塞通信的类。
2.volatile的原理和synchronized的原理
3.java主线程等待所有子线程执行完毕再执行?
(1)用sleep方法,让主线程睡眠一段时间,当然这个睡眠时间是主观的时间,是我们自己定的,这个方法不推荐
(2)使用Thread的join()等待所有的子线程执行完毕,主线程在执行,thread.join()把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B
(3)等待多线程完成的CountDownLatch
(4)同步屏障CyclicBarrier
(5)用java线程池,比如 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5),在线程调度后面加上下面代码:
fixedThreadPool.shutdown();
while (true) {//等待所有任务都执行结束
if (fixedThreadPool.isTerminated()) {//所有的子线程都结束了
System.out.println("共耗时:"+(System.currentTimeMillis()-startTime)/1000.0+"s");
break;
}
}
4.如何控制某个方法允许并发访问线程的个数?
5.Lock和synchronized的区别和使用
Lock接口实现(1)用synchronized修饰的话,当一个线程处于等待某个锁的状态,是无法被中断的,只有一直等待下去
(2)lockInterruptibly()方法比较特殊,当通过这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。也就使说,当两个线程同时通过lock.lockInterruptibly()想获取某个锁时,假若此时线程A获取到了锁,而线程B只有在等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程
(3)tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待
(4)用ReentrantReadWriteLock,如果有一个线程已经占用了读锁,则此时其他线程如果要申请写锁,则申请写锁的线程会一直等待释放读锁。如果有一个线程已经占用了写锁,则此时其他线程如果申请写锁或者读锁,则申请的线程会一直等待释放写锁
(5)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到
(6 )创建ReentrantLock对象时,通过以下方式来设置锁的公平性
ReentrantLock lock = new ReentrantLock(true);
如果参数为true表示为公平锁,为fasle为非公平锁。默认情况下,如果使用无参构造器,则是非公平锁