一步步学习多线程(二) 多线程基础1(线程基本操作)

什么是线程?

线程的基本操作

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);

等待的时候也应该检查是否被打断

public void run() {
while(true){
if(Thread.currentThread().isInterrupted()){
System.out.println("interruted");
break;
}
System.out.println("this is one begin");
try {
Thread.sleep(2000);
System.out.println("this is one end");
} catch (InterruptedException e) {
//抛出异常后会清除中断标记位,所以要再次告知线程被打扰
Thread.currentThread().interrupt();
}
}
}

线程挂起(suspend)和继续执行(resume)线程,不推荐使用

suspend()不会释放锁

不推荐的原因:临界区资源被锁住后,如果suspend(),那么其他的线程也无法访问该资源。同时如果resume方法先于suspend执行,则该方法永远无法执行,例子如下:

public class BadSuspend {
public static Object u = new Object();
static ChangeObjectThread t1 = new ChangeObjectThread("t1");
static ChangeObjectThread t2 = new ChangeObjectThread("t2");
public static class ChangeObjectThread extends Thread {
public ChangeObjectThread(String name){
super.setName(name);
}
@Override
public void run() {
synchronized(u){
System.out.println("in =" + getName());
Thread.currentThread().suspend();
}
}
}
public static void main(String[] args) throws InterruptedException {
t1.start();
Thread.sleep(200);
t2.start();
t1.resume();
t2.resume();
t1.join(); //等待结束
t2.join(); //等待结束
}
}

如果运行上述代码,程序会停住没有结束。


等待线程结束(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);

    }

}

猜你喜欢

转载自blog.csdn.net/money9sun/article/details/80404948