JAVA基础之路——并发(一)

并发(一)

进程、线程

进程是分配资源的基本单位,线程是CPU调度的基本单位。

使用线程给其他任务提供机会

1)Runnable接口,里面只有一个方法,是run方法,用来放置任务代码。

interface Runnable {
    void run();
}
//既然是函数式接口,可以用Lambda表达式来写。
`Runnable r = () ->{};

2)由Runnable创建一个Thread(线程)对象。

Thread  t = new Thread(r);

3)启动线程。

t.start;

在run方法中,可以通过Thread调用的方法:
Thread.sleep(毫秒数);//这个方法是将该线程休眠,以确保其他线程的执行。需要用cry/cetch捕获。

Thread.yield();//这个方法为其他线程临时让出CPU时间,(不过效果一般。)

join();//在某个run方法里,用某个线程调用这个方法可以使这个run方法执行途中去执行调用join的这个线程,待这个线程执行完才可以继续执行run方法。

也可以通过构建一个Thread类的子类定义一个线程:

public class MyThread {
    public void run(){}
}

然后构造一个子类对象,并且调用start方法启动。

警告:不要调用run方法,因为直接调用run方法只会执行同一个线程中的任务,而不会启动新线程,应该调用Thread.start方法,这样将创建一个执行run方法的新线程。

中断线程

线程在运行过程中有可能会被终止或中断,原因有很多种,
比如线程运行完了,会自动终止,再比如run方法中,有if语句判断,成立就return返回,再比如run方法中出现运行时异常,抛出异常会中断进程。
还有某些方法,可以终止进程:
stop方法(已经过时):终止进程
interrupt方法,(也过时了):
每个线程都具有一个boolean标志,所有线程在运行的时候都会时不时检查这个标志,用以判断线程是否被中断。而调用interrupt方法时,线程的中断状态就会被置位,
换句话说也就是线程每次都会通过这个标志判断自己是否应该‘自杀’。
先要搞清楚当前线程中断位置是否被置换,就要调用方法Thread.currentThread获得当前线程,然后调用isInterrupted方法。

while(!Thread.currentThread().isInterrupted() && true/*这里true放的是需要的程序代码*/)
        /*Thread.currentThread()静态方法一定会得到一个布尔类型值,没被置位的话一定是false
          前面加个叹号是为了满足while循环能够执行下去。
         */
}

当进程的标志被置位了之后,while循环条件不再满足,进程自然会终止。
注意:当一个进程在sleep或wait状态下的时候,调用interrupt方法会报错。

boolean isInterrupted();//用来读取当前线程标志状态。
boolean static interrupted();//读出当前进程标志状态,然后不管它原本是真还是假 一律设置为假
void interrupt() ;/用来置位线程标志状态,由false变为true,如果该线程被sleep,那么就会抛出异常
static Thread currentThread();/该方法返回当前线程

以上所学为个人总结。难免不严谨,见谅!

猜你喜欢

转载自blog.csdn.net/weixin_42825755/article/details/82821916