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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qihuan 中级黑马   /  2015-7-6 22:10  /  350 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package practice;

  2. /**
  3. * 多线程
  4. *
  5. * 1.几个概念:
  6. *                 进程:在执行的程序。
  7. *                         每一个进程都有一个执行顺序,该顺序是一个执行路径,或者叫做一个控制单元。
  8. *                 线程:就是进程中一个独立的控制单元。线程在控制着进程的执行。一个进程中至少有一个线程。
  9. *                 *JVM启动时会有一个进程java.exe。该进程中至少有个线程负责java程序的执行。
  10. *                    该线程运行代码存在于main方法中,该线程称之为主线程。
  11. *                    其实,JVM启动不止一个线程,还有负责垃圾回收机制的线程。
  12. *
  13. * 2.线程的创建方式:
  14. *                 第一种方式:(1)继承Thread类。
  15. *                                 (2)复写Thread类中的run方法。
  16. *                                         目的:将自定义代码存储在run方法,让线程运行。
  17. *                                 (3) 调用线程的start方法,该方法里有两个作用:启动线程,调用run方法。
  18. *                 第二种方式:实现Runnable接口。
  19. *                                 (1)定义类实现Runnable接口。
  20. *                                 (2)覆盖Runnable接口中的run方法。
  21. *                                 (3)通过Thread类建立线程对象。
  22. *                                 (4)将Runnable接口的子类对象作为实际参数传递给Thread类。
  23. *                                 (5)调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。
  24. *                 ***两种方式的区别:        (1)实现方式避免了单继承的局限性,在定义线程时建议实现方式。
  25. *                                                 (2)继承Thread,线程代码存放在Thread子类run方法中。
  26. *                                                         实现runnable,线程代码存放在接口子类的run方法中。
  27. *
  28. * 3.多线程特性:随机性。
  29. *
  30. * 4.多线程的安全问题:
  31. *                 问题的原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,
  32. *                                 另一个线程参与进来执行,导致共享数据的错误。
  33. *                 解决办法:        对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以执行。
  34. *                                 Java对多线程问题进行了专业的解决方式:
  35. *                                 (1)同步代码块:
  36. *                                 synchronized(对象){需要被同步的代码}       
  37. *                                 (2)也可以作为修饰符,锁是this。
  38. *                                 如果同步函数被静态修饰后,使用的锁是该方法所在类的字节码文件对象,即类名.class。
  39. *                                 --------------------------------       
  40. *                                 同步的前提:1.必须要有两个或以上的线程。
  41. *                                                 2.必须是多个线程使用同一个锁。
  42. *                                 优点:解决了多线程的安全问题。
  43. *                                 缺点:多线程需要判断锁,较为消耗资源。
  44. * @author Qihuan
  45. *
  46. */

  47. class PrimeThread implements Runnable {
  48.        
  49.         private int ticket = 100;
  50.         Object obj = new Object();
  51.         public void run() {
  52.                 while(true){
  53.                        
  54.                         synchronized(obj){
  55.                                 if(ticket > 0){
  56.                                         try {
  57.                                                 Thread.sleep(20);
  58.                                         } catch (InterruptedException e) {
  59.                                                 // TODO Auto-generated catch block
  60.                                                 e.printStackTrace();
  61.                                         }
  62.                                         System.out.println(Thread.currentThread().getName()+" ------ "+ticket--);
  63.                                 }else{
  64.                                         break;
  65.                                 }
  66.                         }
  67.                 }
  68.         }
  69. }

  70. public class ThreadPractice {
  71.         public static void main(String[] args) {
  72.                 PrimeThread pt = new PrimeThread();
  73.                 new Thread(pt).start();
  74.                 new Thread(pt).start();
  75.                 new Thread(pt).start();
  76.                 new Thread(pt).start();
  77.         }
  78. }
复制代码


0 个回复

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