为了提升程序性能,我们可以将任务分成互相独立的子任务并使用多线程来处理。这里提供了详细的讲解,本文是作者的读书笔记。
线程的生命周期: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()函数可以用于不同的函数。