一.关于线程的常用操作
1.启动线程
run(): 对于run方法的覆写只是指定线程要做的任务清单,而不是真正的启动线程
start(): start()方法才是真正的在底层创建出一个线程,并且启动
2.中断线程
1.通过共享的标记来中断
package demo;
import static java.lang.Thread.sleep;
public class MyThread06 {
private static class MyRunnable implements Runnable{
public static volatile boolean isQuit=false; //设立标志位
@Override
public void run() {
while(!isQuit){
System.out.println(Thread.currentThread().getName()+"正在工作");
try{
sleep(1000); //打印一次休眠1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+" 不工作了");
}
}
public static void main(String[] args) throws InterruptedException {
Thread t=new Thread(new MyRunnable(),"线程1");
t.start();//main主线程创建了另一个线程
System.out.println(Thread.currentThread().getName()+"开始工作");
Thread.sleep(5*1000);//休眠5秒
MyRunnable.isQuit=true;//让标志位改变,让另一个线程停止工作
}
}
2.调用intertrupt()方法通知
package demo;
import static java.lang.Thread.sleep;
public class MyThread07 {
private static class MyRunnable implements Runnable{
@Override
public void run() {
while(!Thread.interrupted()){
System.out.println(Thread.currentThread().getName()+"正在工作");
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
break;//收到打断信号就跳出循环不工作(收到中断信号不跳出循环也可以继续工作)
}
}
System.out.println(Thread.currentThread().getName()+"不工作了");
}
}
public static void main(String[] args) throws InterruptedException {
Thread t=new Thread(new MyRunnable(),"线程1");
t.start();
System.out.println(Thread.currentThread().getName()+"开始工作");
Thread.sleep(5*1000);
t.interrupt();
}
}
3.等待一个线程结束:join()
4.获取当前线程:currentThread()
5.休眠当前线程:sleep()
6.观察一个线程的状态 State()
线程的六大状态:
NEW(new): 新建状态(线程还在刚被new出来的状态)
RUNNABLE(runnable):可运行状态(可运行状态时线程可能正在运行或者处于可被调度的状态)
WAITING(waiting): 等待状态(无限期等待)
TIMEWAITING(time-waiting):超时等待状态(有指定的时间的等待)
BOLCKED(blocked):阻塞状态(线处于阻塞状态)
TERMINATED(terminated):终止状态(线程正常结束运行或者异常结束运行状态)
7.yield() 线程直接让出CPU
二.关于线程安全
1.线程安全:
如果一份多线程的代码是可以运行出我们所预期的结果的,我们就称它在多线程的情况下是符合预期的,是线程安全的。如果结果是不符合预期的,就是线程不安全的。
出现线程安全的原因:
1.多个线程同时修改共享的数据,导致最终的结果不符合预期
2.没有保证原子性,原子性就是一份代码运行的最小单位,如果这个最小单位还没运行结束,其他线程的代码就开始介入,那么就说没有保证原子性,一个线程正在对共享变量操作,还没操作完毕,其他线程就介入,结果就会不符合预期,线程就不安全。
3.没有保证可见性,没有保证可见性就是一个线程对于一个变量的修改,没有及时被其他线程看到。