Java基础 之 多线程(1)

xiaoxiao2021-02-27  158

 首先需要理解概念 :进程

 程序的执行过程,其可以理解为持有资源和线程,例如QQ,ECLIPSE等,当闲置在硬件中时不能称之为进程,当期执行后可以称之为进程。

概念:线程

可以理解为:比如某些操作,例如文字聊天,收发文件等,可以近似理解为线程,若把一个进行进程比作一个进程,则班级中的每个人可以理解为一个线程,线程是班级中最小的单元就好比进程中最先的单元,线程有互斥和同步的行为,互斥就好比两个同学在争抢一个学习资料,同步就好比全班打扫卫生,这样共同协作才能够完成一个

特定的任务。

   同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步的方法或者同步代码块的每个线程,都看到由同一个锁保护的之前的所有的修改效果。Java的语言规范保证读或者是写一个变量都是原子的,除非这个变量亮是Long或者是Double,也就是说读取一个非Long或者是double类型的变量可以保证返回的值是某个线程保存在该变量中的,即时多个线程在没有同步的情况下并发的修改这个变量。若要深入了解则需要参考Java的内存模型。

要阻止一个线程妨碍另一个线程,建议的做法是让第一个线程循环访问设置的一个boolean域,这个域一开始设置为false,但是可以通过第二个线程将其值设置为true,以表示第一个线程将终止自己,由于boolean域的读写操作都是原子的,在访问这个域的时候不再使用同步。

public class StopThread { //设置静态类型和类的承运变量时有默认值:false //设置的boolean域,用于控制 private static boolean stopRequested; public static void main(String[] args) throws InterruptedException { Thread backGroundThread = new Thread(new Runnable() { public void run(){ int i=0; while(!stopRequested){ i++; } } }); //启动线程 backGroundThread.start(); //设置休眠一秒 TimeUnit.SECONDS.sleep(1); stopRequested=true; }   上述代码并不会像预想的那样,进行一秒后结束,因为main()是一个线程,且是主线程,而新创建的实现Runnable()接口的实例也是另一个线程,然而当我们在主线程中修改设置的boolean域的时候并不能被主进程所修改,所以一旦启动时,就不结束。

      修正这个问题的方法就是同步访问stopRequest域。

public class StopThread { //设置静态类型和类的承运变量时有默认值:false //设置的boolean域,用于控制 private static boolean stopRequested; //同步的requestStop()的方法来修正stopRequest private static synchronized void requestStop(){ stopRequested =true; } //同步的读方法,stopRequested private static synchronized boolean stopRequested(){ return stopRequested; } public static void main(String[] args) throws InterruptedException { Thread backGroundThread = new Thread(new Runnable() { public void run(){ int i=0; while(!stopRequested()){ i++; } } }); //启动线程 backGroundThread.start(); //设置休眠一秒 TimeUnit.SECONDS.sleep(1); requestStop(); } }     注意,将写方法和读方法都要同步,若只写一个,则实际上没有同步,就不会起到同步的作用。这样做其实是为了两个线程之间的通信,能过够看到对方,不是为了互斥访问。

转载请注明原文地址: https://www.6miu.com/read-12269.html

最新回复(0)