并发(一)
进程、线程
进程是分配资源的基本单位,线程是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();/该方法返回当前线程
以上所学为个人总结。难免不严谨,见谅!