黑马程序员_java基础——多线程

来源:互联网 发布:埃文特纳nba数据 编辑:程序博客网 时间:2024/06/05 10:45

 ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

       当计算机运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的。在进程中,有些程序流程块是可以乱序执行的,并且这个代码块可以同时被多次执行。实际上,这样的代码块就是线程体。线程是进程中乱序执行的代码流程。当多个线程同时运行的时候,就是多线程,多线程的好处就是可以最大限度的利用CPU资源。

      所谓的“并发执行”、“同时”其实都不是真正意义上的“同时”,因为CPU同一时刻只能执行一个命令,而是在做快速的切换,只不过这个切换速度特别快。在Java中,多线程的实现有两种方式:继承Thread类重写run方法和实现Runnable接口重写run方法。

  继承Thread类重写run方法线程的启动方法:

  Ticket t1=new Ticket();

  Ticket t1=new Ticket();

   t1.start();
   t2.start();

实现Runnable接口重写run方法线程的启动方法:

  Thread t1=new Thread(new Ticket(),"t1");
  Thread t2=new Thread(new Ticket(),"t2");

   t1.start();
   t2.start();

    多个线程对CPU资源的竞争会带来线程安全问题,而Synchronized关键字很好的解决了这个问题。Synchronized用于同步代码块,当然前提是要分清哪些数据是同步代码块。每个对象都有一个锁标志,当一个线程访问该对象时,被Synchronized修饰的数据标志位发生变化,阻止其他线程访问同步代码块。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。

如卖票问题中的同步代码块:

synchronized (this) {if(number>0){System.out.println(Thread.currentThread().getName()+"正在卖票,"+"还剩"+number+"张票");number--;}
就可以很好的预防同一张票被多次卖出去。

0 0