java多线程编程核心技术

2017-06-04  本文已影响26人  yueyue_projects

第一章:java多线程技能

开启线程

这里就不说了,有threadrunnable可以实现

停止线程

public class MyThread extends Thread {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        for(int i = 0; i < 10000; i++){
            System.out.println("i=" + (i + 1));
        }
    }
//停止非主线程的方法,但没有真正停止
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        try {
            Thread.sleep(10);
            thread.interrupt();
            System.out.println("是否停止1?" + thread.isInterrupted());
            System.out.println("是否停止2?" + thread.isInterrupted());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("end!");
    }
}
线程停止示意图
MyThread run()换成如下代码段即可,此方法为异常停止法,一般都是用这种方法
public void run() {
        // TODO Auto-generated method stub
        super.run();
        try {
            for(int i = 0; i < 10000; i++){
                if(this.isInterrupted()){
                    System.out.println("已经是停止状态,我要退出了");
                    throw new InterruptedException();
                }
                System.out.println("i=" + (i + 1));
            }
        } catch (InterruptedException e) {
            // TODO: handle exception
            System.out.println("进MyThread.java类run方法中的catch了");
            e.printStackTrace();
        }
        
    }

执行结果:


Paste_Image.png

暂停线程

线程的优先级

守护线程

比如GC(垃圾回收器)就是守护线程。其满足一条性质即用户线程开启,则守护线程开启,关闭,则关闭

第二章:对象及变量的并发访问

synchronized关键字

//阻塞了整个对象
synchronized void f1(){
    //网络请求操作
    ...
}
synchronized void f2(){
  //网络请求操作
  ...
}

分析知,当对象调用f1()的时候,f2()被阻塞,而

 void f1(){
    //网络请求操作
    synchronized(非this对象)
...
}
synchronized void f2(){
  //网络请求操作
  synchronized(非this对象){
...
}
}

分析知,该情况f2()是不会阻塞的

class X{
  void test(Y y){
      synchronized(y){
  ...
}
}
}
class Y{
  synchronized void f1(){
  ...
}
}

分析:当A正在执行test(Y y)时,其他线程并不能执行f1()函数,因为 synchronized(y)锁住了y对象

class X{
//f1(),f2()的调用后,他们的锁其实就是同一把(因为静态独一份)
synchronized public static void f1(){...};
synchronized public static void f2(){...};
// g1和g2的调用,锁的是其分别的调用对象实例,这两把锁是不同的
synchronized public void g1(){...};
synchronized public void g2(){...};
}
//假设f1()是一个类似监听的死循环(死循环根据其性质是不需要和任何方法同步的),f2(),f3()之间彼此需要同步,f4(),f5()也需要同步,而f2()与f4()之前不需要同步,因为极有可能会影响效率
class X{
f1(){...};
Object object1 = new Object();
f2(){
synchronized(object1){...}
};
f3(){
synchronized(object1){...}
};
Object object2 = new Object();
f4(){
synchronized(object2){...}
};
f5(){
synchronized(object2){...}
};
}

volatile关键字

class X{
bool isTrue = true;
void f1(){
while(isTrue){
Object object = new Object
//该句话在内部将私有堆栈变量和公共堆栈变量进行同步啦,即将私有堆栈的变量写入公有堆栈
synchronized(object){
}
System.out.print("已经停止");
}
void setFalse(){
 isTrue = false
}
}
}

第三章:线程间通信

等待/通知机制(关于wait和notify的一些应用)

基本使用
public class MyThread1 extends Thread{
    private Object lock;
    public MyThread1(Object lock){
        this.lock = lock;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        synchronized (lock) {
            try {   
                System.out.println("wait start");
                lock.wait();
                System.out.println("wait end");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
public class MyThread2 extends Thread{
    private Object lock;
    public MyThread2(Object lock){
        this.lock = lock;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        synchronized (lock) {
            System.out.println("notify start");
            lock.notify();
            System.out.println("notify end");
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Object lock = new Object();
        MyThread1 thread1 = new MyThread1(lock);
        MyThread2 thread2 = new MyThread2(lock);
        thread1.start();
//      try {
//          Thread.sleep(2000);
//      } catch (InterruptedException e) {
//          // TODO Auto-generated catch block
//          e.printStackTrace();
//      }
        thread2.start();
    }
}
output: wait start
notify start
notify end
wait end

join方法的使用

类ThreadLocal方法的使用

上一篇下一篇

猜你喜欢

热点阅读