A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------

1、创建线程的方式:实现Runnable接口
步骤:
      1、定义类实现Runnable接口。
      2、覆盖Runnable接口中的run方法。
      3、通过Thread类建立线程对象。
      4、将Runnable接口的子类对象作为实际参数传递给Thead类的构造函数。
为什么要将Runnable接口的子类对象传递给Thread的构造函数,因为自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程去指定指定对象的run方法。就必须明确该run方法所属对象。
       5、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

  1. <div class="blockcode"><blockquote>/**
  2. 创建两个线程,和主线交替运行
  3. */

  4. class Test extends Thread
  5. {
  6.        
  7.         Test(String name)
  8.         {
  9.                         super(name);
  10.         }
  11.         public void run()
  12.         {
  13.                
  14.                 for(int x = 0; x < 60;x ++)
  15.                 {
  16.                         System.out.println("test run..." + x + super.currentThread().getName());
  17.                 }
  18.         }
  19. }

  20. class ThreadTest
  21. {
  22.         public static void main(String[] args)
  23.         {
  24.                 Test t1 = new Test("one");
  25.                 Test t2 = new Test("two");
  26.                
  27.                 t1.start();
  28.                 t2.start();
  29.                
  30.                 for(int x = 0; x < 60; x ++)
  31.                 {
  32.                         System.out.println("main..." + x);
  33.                 }
  34.         }
  35. }
复制代码




2、实现方式和继承方式
         实现方式的好处:避免了单继承的局限性,在定义线程时,建立使用实现方式。
        两种方式的区别:
               继承Thread:线程代码存放Thread子类run方法中;
               实现Runnable;线程代码存在接口的子类的run方法。

3、多线程的安全问题:
           原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完。另一个线程参与进来执行,导致共享数据的错误。
          解决办法:对多条操作共享数据的语句,只能让一个线程执行完,在执行过程中,其他线程不可以参与执行。
  1. <div class="blockcode"><blockquote>/**
  2. 死锁例子
  3. */

  4. class Test implements Runnable
  5. {
  6.         private boolean p;
  7.         Test(boolean p)
  8.         {
  9.                 this.p = p;
  10.         }
  11.        
  12.         public void run()
  13.         {
  14.                 if(p)
  15.                 {
  16.                         synchronized(Mylock.locka)
  17.                         {
  18.                                 System.out.println("if locka");
  19.                                 synchronized(Mylock.lockb)
  20.                                 {
  21.                                         System.out.println("if lockb");
  22.                                 }
  23.                         }
  24.                 }
  25.                 else
  26.                 {
  27.                         synchronized(Mylock.lockb)
  28.                         {
  29.                                 System.out.println("else lockb");
  30.                                 synchronized(Mylock.locka)
  31.                                 {
  32.                                         System.out.println("else locka");
  33.                                 }
  34.                         }
  35.                 }
  36.         }
  37. }

  38. class Mylock
  39. {
  40.         static Object locka = new Object();
  41.         static Object lockb = new Object();
  42. }
  43. public class DeadLock
  44. {
  45.         public static void main(String[] args)
  46.         {
  47.                 Thread t1 = new Thread(new Test(true));
  48.                 Thread t2 = new Thread(new Test(false));
  49.                
  50.                 t1.start();
  51.                 t2.start();
  52.         }
  53. }
复制代码



4、Java对于多线程的安全问题提供了专业的解决方式。就是同步代码块。
        Syschronized(对象(可以使用Object类))
        {
                      需要被同步的代码;
        }
       此处对象为什么必须要建在run函数外部?此对象如同锁,持有锁的线程可以在同步中执行,没有持有锁的线程即使获取cpu的执行权也进不去,因为没有获取锁。
       同步的前提:
      1、必须要有两个或两个以上的线程;
      2、必须是多个线程使用同一个锁;
      3、必须保证同步中只能有一个线程在进行。
好处:解决了多线程的安全问题。
  1. <div class="blockcode"><blockquote>/**
  2. 需求:简单的卖票程序。
  3. 多个窗口同时卖票

  4. */

  5. class Ticket implements Runnable     
  6. {
  7.         private int tick = 100;
  8.         Object object = new Object();
  9.         public void run()
  10.         {
  11.                 synchronized(object)
  12.                 {
  13.                 while(true)
  14.                 {
  15.                        
  16.                                 if(tick > 0)
  17.                                 {
  18.                                         try{Thread.sleep(10);} catch(Exception e) {}
  19.                                         System.out.println(Thread.currentThread().getName() + "sale : " + tick--);
  20.                                 }
  21.                        
  22.                         if(tick <= 0)
  23.                                 break;
  24.                 }
  25.                 }
  26.         }
  27. }

  28. class TicketThread
  29. {
  30.         public static void main(String[] args)
  31.         {
  32.                
  33.                 Ticket t = new Ticket();
  34.                
  35.                 Thread t1 = new Thread(t);
  36.                 Thread t2 = new Thread(t);
  37.                 Thread t3 = new Thread(t);
  38.                 Thread t4 = new Thread(t);
  39.                
  40.                 t1.start();
  41.                 t2.start();
  42.                 t3.start();
  43.                 t4.start();
  44.         }
  45. }
复制代码




----------android培训java培训、java学习型技术博客、期待与您交流!------------

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马