什么是线程?
线程的基本操作
1、什么是线程
线程是进程内的执行单元,在JAVA当中建立的线程会映射到操作系统中去。在多线程OS中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体
2、线程的基本操作
3、线程的基本操作
新建线程:Thread t1 = new Thread(); t1.start();
注:如果是t1.run() 则不会新开一个线程,而且在原有线程中执行;
两种方式重写run方法,一种直接重写,一种传入一个Runnable的接口实例
Thread1 t1 = new Thread(){
@Override
public void run(){
System.out.println("Hello I am t1");
}
}
t1.start();
第二种
public classs CreateThread implements Runnable{}
Thead1 t1 = new Thread(new CreateThread()){};
t1.start;
线程终止:Thread.stop() 不推荐使用,它会立即释放所有monitor(对象或锁),会导致多线程的数据的不一致性,例如写进程突然终止,读进程可能会读到刚才还没有写完的“残破”的数据。
中断线程:三种方法
void Thread.interrupt() // 中断线程
boolean Thread.isInterrupted() //判断是否被中断
static boolean Thread.interrupted() //判断是否被中断,并清除当前中断状态
直接打断,并不能够把该线程中断,因为一直在循环中:
public void run(){
while(true){
Thread.yield();
}
}
t1.interrupt();
优雅的方法,如果发现有人“打招呼”,就会跳出循环:
public void run(){
while(true){
if(Thread.currentThread().isInterrputed()){
System.out.println("interrupted");
break;
}
Thread.yield();
}}
线程睡眠:Thread.sleep(2000);
等待的时候也应该检查是否被打断
线程挂起(suspend)和继续执行(resume)线程,不推荐使用
suspend()不会释放锁
不推荐的原因:临界区资源被锁住后,如果suspend(),那么其他的线程也无法访问该资源。同时如果resume方法先于suspend执行,则该方法永远无法执行,例子如下:
如果运行上述代码,程序会停住没有结束。
等待线程结束(join)和谦让(yeild)
yeild:释放当前占用的CPU,并再来竞争(给你机会跟我抢)
join() 等待线程结束后,后面的代码执行,例子如下:
public class JoinMain {
public volatile static int i = 0;
public static class AddThread extends Thread {
@Override
public void run(){
for(i=0;i<100000;i++);
}
}
public static void main(String[] args) throws InterruptedException {
AddThread at = new AddThread();
at.start();
at.join();
System.out.println(i);
}
}