Java多线程笔记

2019-03-05  本文已影响0人  Coding_Wolf

1.sleep\wait\yield

public class SleepLockTest{ 
private static Object obj = new Object();
public static void main(String[] args){ 
    ThreadA t1 = new ThreadA("t1"); 
    ThreadA t2 = new ThreadA("t2"); 
    t1.start(); 
    t2.start();
} 

static class ThreadA extends Thread{
    public ThreadA(String name){ 
        super(name); 
    } 
    public void run(){ 
        // 获取obj对象的同步锁
        synchronized (obj) {
            try {
                for(int i=0; i <10; i++){ 
                    System.out.printf("%s: %d\n", this.getName(), i); 
                    // i能被4整除时,休眠100毫秒
                    if (i%4 == 0)
                        Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    } 
  } 
}

2.守护线程

1.Java分为两种线程:用户线程和守护线程。
所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者。
这种线程并不属于程序中不可或缺的部分,因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。
2.用户线程和守护线程区别:
如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。
3.代码实现及注意事项
(1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
(2) 在Daemon线程中产生的新线程也是Daemon的。
(3) 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。

3.锁机制

上述操作还可以用synchronized关键字和wait/notifyAll方法来完成。
synchronized <==> lock+unlock
wait/notifyAll <==> c.await/c.signalAll

4.Lock/Condition 和 同步方法的取舍

  • 最好都不用,采用java.util.concurrent包里面提供的机制,它会为你处理所有的加锁,例如阻塞队列
  • synchronized可以减少代码编写数量和出错几率。
  • 需要Lock/Condition的独有特性时才使用。

5.yield和join

1.yield

2.join
线程实例的方法join()方法可以使得一个线程在另一个线程结束后再执行。如果join()方法在一个线程实例上调用,当前运行着的线程将阻塞直到这个线程实例完成了执行。

上一篇 下一篇

猜你喜欢

热点阅读