一.关于线程的常用操作
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; //设立标志位@Overridepublic 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{@Overridepublic 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.没有保证可见性,没有保证可见性就是一个线程对于一个变量的修改,没有及时被其他线程看到。