java并行程序基础
主要内容有线程的基本操作、线程的相关语法、在线程下的错误三部分
线程的基本操作
线程的基本操作有:创建线程、停止线程、线程中断、等待(wait)和通知(notify)、挂起(suspend)和继续执行(resume)、等待线程结束(join)和谦让(yield)
线程的状态与生命周期
线程的生命周期主要有 创建、运行状态、阻塞状态、无限等待、有限等待、结束,这六个状态。
线程所有状态在Thread类中的State枚举中定义。
线程创建
创建并启动线程很简单,创建线程对象,然后通过该对象的start
方法启动该线程的代码块
创建线程对象有两种方法:一是继承Thread
类并改写run
方法;一是实现Runable
接口,实现其中的run
方法。
在java线程中,多线程执行的代码块就是执行线程中的Run方法或者是传入线程中Runable
实现类中的 方法。
(1)继承Thread
创建线程并启动线程
Thread t = new Thread(){
public void run(){
//多线程代码块
}
};
t.start();
(2)通过实现Runable
接口创建并启动线程。
Thread t = new Thread(new Runable(){
public void run(){
//多线程代码块
}
}
);
t.start();
终止线程
终止线程是指在线程启用后,使得run方法运行结束。
一般而言终止线程特指的是,通过外界干预使得run方法结束。
java中提供了一个强制终止线程的方法stop
,该方法可以强制停止线程中执行的方法,但是会导致数据不一致现象。
下面代码就展示了这个问题
public class StopThreadTest implements Runnable {
public static int key1 =0;
public static int key2=0;
public static Object readKey = new Object();
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized (readKey) {
if(StopThreadTest.key1!=StopThreadTest.key2){
System.out.println("数据不一致 key1=" +key1+" key2=" +key2);
}
}
}
}
public static class Change extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
int k;
while (true) {
synchronized (readKey) {
k=(int) (System.currentTimeMillis()/1000);
StopThreadTest.key1=k;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
StopThreadTest.key2=k;
}
Thread.yield();
}
}
}
public static void main(String[] args) throws InterruptedException{
new Thread(new StopThreadTest()).start();
Thread t = null;
while(true){
t = new Change();
t.start();
Thread.sleep(150);
t.stop();
}
}
}