Java基础 之 多线程(1)

来源:互联网 发布:倍量画线主图公式源码 编辑:程序博客网 时间:2024/06/06 10:38

 首先需要理解概念 :进程

 程序的执行过程,其可以理解为持有资源和线程,例如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()的方法来修正stopRequestprivate static synchronized void requestStop(){stopRequested =true;}//同步的读方法,stopRequestedprivate 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();}}
    注意,将写方法和读方法都要同步,若只写一个,则实际上没有同步,就不会起到同步的作用。这样做其实是为了两个线程之间的通信,能过够看到对方,不是为了互斥访问。







原创粉丝点击