多线程
多线程是Java平台非常重要的特性,Java一开始设计就支持并发编程
多线程有时称作轻量级进程,进程和线程都有一个执行环境,但是创建一个线程所需的资源小于创建一个进程的。线程存在于进程中,一个进程至少含一个线程,多个线程共享进程的资源,包括内存和打开的文件,这造成了有效的却有着潜在错误的通信.
线程对象 两种用线程创建并发应用的策略
- 直接控制线程的创建和管理,每次实例化一个Thread类当应用需要一个异步任务的时候。
- 将线程管理从应用中抽象出来,将应用的任务传递给executor
Defining and Starting a Thread
package tij.javathread;
import tij.Utils;
/**
* Created by Administrator on 2015/11/9.
*/
public class HelloThread implements Runnable{
public void run(){
Utils.print("HelloThread running!");
}
public static void main(String[] args){
new Thread(new HelloThread()).start();
}
}
package tij.javathread;
import tij.Utils;
/**
* Created by Administrator on 2015/11/9.
*/
public class HelloThread1 extends Thread{
public void run(){
Utils.print("HelloThread1 that extends Thread runnning!");
}
public static void main(String[] args){
new HelloThread1().start();
}
}
两种用法中实现Runnable接口更灵活,因为实现了Runnable接口的类可以继承其他的类,而继承了Thread的类无法在继承其他类.
Thread.sleep
Sleep方法使当前线程暂停执行一段时间,是一个高效的方法使得处理器时间可用于应用中的其他线程或者运行于系统上的其他应用.Sleep方法有两种重载形式,一种参数为毫秒,一种参数为纳秒(十亿分之一秒)。
Thread.sleep方法指定的时间不能保证是精确的,因为具体的OS下提供的设备的限制,暂停阶段也能被interrupts打断。在任何情况下你不能假定调用sleep方法会精确的暂停指定的时间。
package tij.javathread;
import tij.Utils;
/**
* Created by Administrator on 2015/11/10.
*/
public class SleepMessages {
public static void main(String[] args) throws InterruptedException{
String info[]={
"a",
"b",
"c",
"d"
};
//Sleep方法使当前线程暂停执行一段时间
//是一个高效的方法使得处理器时间可用于应用中的其他线程
//或者运行于系统上的其他应用
for(String s:info){
//Pause 4 seconds
Thread.sleep(4000);
Utils.print(s);
}
}
}
Interrupts
一个中断标示一个线程需要停下当前正在进行的事而去做其他的事。
一个线程通过调用interrupt方法发送中断至需要被中断的线程对象。
Support Interrupt
一个线程如何支持自己的中断?这取决于它正在做什么,如果它在频繁的调用抛出InterruptedException的方法,那么在它捕获这个异常后,将从run方法中返回(return).
如果一个线程长时间运行而没有调用InterruptedException的方法?它需要周期性的调用Thread.interrupted方法来检测是否已收到中断.
中断状态标志
- 中断机制是通过中断状态来实现的
- Thread.interrupt方法设置中断状态
- Thread.interrupted清除中断状态
- isInterrupted方法用来查询线程中断状态,但不改变中断状态
- 一个通过抛出InterruptedException来退出的方法会清除中断状态。
Join
join方法允许一个线程等待另一个线程的完成。
如果t是一个线程对象,调用
t.join();
将使当前线程暂停执行直到t的线程中止.
Thread interference
两个运行于不同的线程中的对同一个数据的操作交错的执行时interfernce发生了
Synchronized methods
making methods synchronized has two effects
package threads;
/**
* Created by MineMac on 15/11/14.
*/
/*
java提供了两种同步语法:synchronized methods and synchronized statements
*/
public class SynchronizedCounter {
private int c=0;
//to make a method synchronized
//在方法申明中加入synchronized关键字
public synchronized void increment(){
c++;
}
public synchronized void decrement(){
c--;
}
public synchronized int value(){
return c;
}
}
1.对同一个同步方法的两次调用不会交错。
2.当一个同步方法存在后,它自动的建立了与随后调用的happens-before关系。
同步方法建立了简单的策略来防止thread interference和内存一致错误:如果一个对象对一个以上的线程是透明的,对这个对象的所有的读和写都是通过同步方法来完成的。