多线程 等待/通知机制
1.通过操作值和操作栈进行传递消息
多生产 多消费 模式要多看看
2.通过管道进行传递消息
2.1字节流
PipedInputStream PipedOutputStream
2.2字符流
PipedReader PipedWriter
3.join 意思就是把子线程合并到主线程上来
主线程创建并启动了子线程,为了防止子线程未完成主线程就结束,需要调用子线程的join方法,达到让主线程等待子线程运行完的效果
3.1join内部使用wait来进行等待,sychronized使用对象监视器来同步
3.2join过程中,如果主线程被中断会报错,但是子线程依然运行
3.3join和wait一样,哪个线程执行的此操作,等待的就是哪个线程,和调用者没有关系,调用者只是一个锁对象而已。线程本身就是锁对象
通过3.3可以知道,join必须要得到锁对象才行,也就是说他必须要去抢锁,然后才会等待。
4.ThreadLocal
每个线程的私有变量
同级线程之间,和父子线程之间都具有隔离性,最常见的ThreadLocal使用场景为 用来解决 数据库连接、Session管理等。
具体可以参考:http://qifuguang.me/2015/09/02/[Java%E5%B9%B6%E5%8F%91%E5%8C%85%E5%AD%A6%E4%B9%A0%E4%B8%83]%E8%A7%A3%E5%AF%86ThreadLocal/#comments
InheritableThreadLocal
可以让子线程继承父线程的值
主线程和子线程的关系是什么?
第一种是父线程是进程的主线程,子线程由主线程创建;
第二种情况是父线程为进程主线程创建的一个子线程,而这个子线程又创建了一个孙线程,这种情况大多被称为子孙线程。
对于java而言:使用main方法作为程序入口时,其实是启动了一个进程。所以即使主线程(main方法创建的线程)只执行一次,只要其子线程未执行结束,就会一直处于运行状态。
1.通过操作值和操作栈进行传递消息
多生产 多消费 模式要多看看
2.通过管道进行传递消息
2.1字节流
PipedInputStream PipedOutputStream
2.2字符流
PipedReader PipedWriter
3.join 意思就是把子线程合并到主线程上来
主线程创建并启动了子线程,为了防止子线程未完成主线程就结束,需要调用子线程的join方法,达到让主线程等待子线程运行完的效果
3.1join内部使用wait来进行等待,sychronized使用对象监视器来同步
3.2join过程中,如果主线程被中断会报错,但是子线程依然运行
3.3join和wait一样,哪个线程执行的此操作,等待的就是哪个线程,和调用者没有关系,调用者只是一个锁对象而已。线程本身就是锁对象
通过3.3可以知道,join必须要得到锁对象才行,也就是说他必须要去抢锁,然后才会等待。
4.ThreadLocal
每个线程的私有变量
同级线程之间,和父子线程之间都具有隔离性,最常见的ThreadLocal使用场景为 用来解决 数据库连接、Session管理等。
private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>() {
public Connection initialValue() {
return DriverManager.getConnection(DB_URL);
}
};
public static Connection getConnection() {
return connectionHolder.get();
}
具体可以参考:http://qifuguang.me/2015/09/02/[Java%E5%B9%B6%E5%8F%91%E5%8C%85%E5%AD%A6%E4%B9%A0%E4%B8%83]%E8%A7%A3%E5%AF%86ThreadLocal/#comments
InheritableThreadLocal
可以让子线程继承父线程的值
主线程和子线程的关系是什么?
第一种是父线程是进程的主线程,子线程由主线程创建;
第二种情况是父线程为进程主线程创建的一个子线程,而这个子线程又创建了一个孙线程,这种情况大多被称为子孙线程。
对于java而言:使用main方法作为程序入口时,其实是启动了一个进程。所以即使主线程(main方法创建的线程)只执行一次,只要其子线程未执行结束,就会一直处于运行状态。