Concurrency

2017-07-23  本文已影响0人  闪亮亮的简书

为了提升程序性能,我们可以将任务分成互相独立的子任务并使用多线程来处理。这里提供了详细的讲解,本文是作者的读书笔记。

线程的生命周期:New, Waiting, Running, Dead等。

线程具有优先级,从MIN_PRIORITY(1)到MAX_PRIORITY(10),线程的默认优先级为NORM_PRIORITY(5),优先级越高,越容易被执行。

有两种方式来创建thread,by implementing Runnable Interface, by extending Thread class。

Implementing Runnable Interface

1. 创建实现Runnable接口的类并实现其run()函数;

2. 利用Thread类的Thread(Runnable threadObj, String threadName)来创建thread;

3. 调用thread的start()方法来执行线程。

Extending Thread Class

1. 通过继承Thread class来生成thread并override起run()函数;

2. 调用Thread的start()方法来执行线程。

Inter-thread communication

我们可以在thread之间使用wait(),notify()进行控制,如下所示。synchronized用于确保对象或方法在同一时间只能被一个线程访问。

public boolean flag = false;

public synchronized void Question(String  msg){

    if(flag){

          try{

                wait();

          }catch(InterruptedException e){

                e.printStackTrace();

         }

     }

    System.out.println(msg);

   flag = true;

   notify();

}

ThreadLocal class

Threadlocal class 创建的变量在每个thread中保存一个备份,只能被本线程读写,因此,不会受其他线程影响。下面的两个counter,counter会受不同线程的影响,而threadLocalCounter只受本线程的影响,不受其他线程影响。

class RunnableDemo implements Runnable {  

int counter;  ThreadLocal threadLocalCounter = new ThreadLocal();

public void run() {

counter++;

if(threadLocalCounter.get() != null){

threadLocalCounter.set(threadLocalCounter.get().intValue() + 1);

}else{

threadLocalCounter.set(0);

}

System.out.println("Counter: " + counter);

System.out.println("threadLocalCounter: " + threadLocalCounter.get());

}

}

Deadlock是因为由于多个线程需要相同的locks,但是以不同顺利获得这些locks造成的。

lock和synchronized的区别:1.synchronized不能保证顺序,而lock可以;2. synchronized block没有timeout,而lock可以提供timeout功能;3.synchronized只能作用于同一个函数,而lock的lock()和unlock()函数可以用于不同的函数。

上一篇 下一篇

猜你喜欢

热点阅读