java-多线程2

一、实现多进程的方式2  :避免了类的单继承的不足,且适合多个相同的程序代码去处理同一个资源的情况,把线程同程序的代码和数据分离。

 1 package test;
 2 
 3 /*
 4  * 实现多多进程的方式2:继承Runnable接口
 5  * 步骤:
 6  *     1自定义MyRunnable类继承接口Runnable
 7  * 2重写run()方法
 8  * 3创建MyRunnable类的对象
 9  * 4创建Thread对象,并把步骤3的对象作为构造参数传递
10  * */
11 
12 public class Test01{
13     public static void main(String[] args) {
14         MyRunnable mr=new MyRunnable();
15         
16         Thread t1=new Thread(mr,"进程1");
17         Thread t2=new Thread(mr,"进程2");
18         
19         t1.start();
20         t2.start();
21         
22     }
23 }
 1 package test;
 2 
 3 public class MyRunnable implements Runnable{
 4     @Override
 5     public void run() {
 6         // TODO Auto-generated method stub
 7         for(int i=0;i<100;i++){
 8             //由于实现接口的方式就不能直接使用Thread的方法getName(),但可以间接使用
 9             System.out.println(Thread.currentThread().getName()+":"+i);
10         }
11     }
12 }

二、线程同步

 1 package test;
 2 
 3 /*
 4  * 加入了延迟后,出现了负数票和相同票
 5  * 
 6  * A:是否多线程环境?是
 7  * B:是否有共享数据?是
 8  * C:是否有多条语句操作共享数据?是
 9  * 
10  * 解决方法:把多条语句操作共享数据的代码包为一个整体:让某个线程在执行的时候,别人无法执行
11  * 
12  * 同步机制
13  * 
14  * 同步代码块:
15  *     synchronized(对象){
16  * 需要被同步的代码
17  * }
18  * */
19 
20 public class MyRunnable implements Runnable {
21     private int tickets = 100;
22     private Object obj=new Object();
23     @Override
24     public void run() {
25         // TODO Auto-generated method stub
26         while (true) {
27             synchronized (obj) {
28                 if (tickets > 0) {
29                     try {
30                         Thread.sleep(100);
31                     } catch (InterruptedException e) {
32                         // TODO Auto-generated catch block
33                         e.printStackTrace();
34                     }
35                     System.out.println(Thread.currentThread().getName()
36                             + "正在出售第" + (tickets--) + "张票");
37                 }
38             }
39 
40         }
41     }
42 }
 1 package test;
 2 
 3 /*
 4  * 某电影院目前正在上映电影,共有100张票,有三个窗口售票,设计一个程序模拟该电影院售票
 5  * */
 6 
 7 public class Test01{
 8     public static void main(String[] args) {
 9         //创建资源对象
10         MyRunnable mr=new MyRunnable();
11         
12         //创建三个线程对象
13         Thread t1=new Thread(mr,"窗口1");
14         Thread t2=new Thread(mr,"窗口2");
15         Thread t3=new Thread(mr,"窗口3");
16         //启动线程
17         t1.start();
18         t2.start();
19         t3.start();
20         
21     }
22 }

线程同步:

1前提:多个线程、同一把锁

2好处:解决了多线程的安全问题

3弊病:降低了效率

 

三、同步方法

 1 package test;
 2 
 3 /*
 4  * A:同步代码块:任意的对象作为锁
 5  * 
 6  * B:同步方法的格式:把同步关键字放到方法声明上
 7  *             同步方法的锁对象是:this
 8  * 
 9  * C:静态方法:锁子是当前类的对象  MyRunnable.class
10  * 
11  * */
12 
13 public class MyRunnable implements Runnable {
14     private int tickets = 100;
15     private Object obj = new Object();
16     private int x = 0;
17 
18     @Override
19     public void run() {
20         // TODO Auto-generated method stub
21         while (true) {
22             if (x % 2 == 0) {
23                 synchronized (this) {
24                     if (tickets > 0) {
25                         try {
26                             Thread.sleep(100);
27                         } catch (InterruptedException e) {
28                             // TODO Auto-generated catch block
29                             e.printStackTrace();
30                         }
31                         System.out.println(Thread.currentThread().getName()
32                                 + "正在出售第" + (tickets--) + "张票");
33                     }
34                 }
35             } else {
36                 sellTickets();
37             }
38         }
39     }
40 
41     private synchronized void sellTickets() {
42         if (tickets > 0) {
43             try {
44                 Thread.sleep(100);
45             } catch (InterruptedException e) {
46                 // TODO Auto-generated catch block
47                 e.printStackTrace();
48             }
49             System.out.println(Thread.currentThread().getName() + "正在出售第"
50                     + (tickets--) + "张票");
51         }
52     }
53 }
 1 package test;
 2 
 3 /*
 4  * 某电影院目前正在上映电影,共有100张票,有三个窗口售票,设计一个程序模拟该电影院售票
 5  * */
 6 
 7 public class Test01{
 8     public static void main(String[] args) {
 9         //创建资源对象
10         MyRunnable mr=new MyRunnable();
11         
12         //创建三个线程对象
13         Thread t1=new Thread(mr,"窗口1");
14         Thread t2=new Thread(mr,"窗口2");
15         Thread t3=new Thread(mr,"窗口3");
16         //启动线程
17         t1.start();
18         t2.start();
19         t3.start();
20         
21     }
22 }

 

posted @ 2015-08-22 23:27  chengling  阅读(164)  评论(0编辑  收藏  举报