幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2608|回复: 2

[java]请教下线程的同步块问题

[复制链接]

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2007-11-13 11:19:03 | 显示全部楼层 |阅读模式
  1. class Print extends Thread{
  2.     int[] array;
  3.     static StringBuffer sb=new StringBuffer();
  4.     static Object ob=new Object();
  5.     public Print(int[] array){
  6.         this.array=array;
  7.     }
  8.     public void addleft(){
  9.         for(int i=0;i<array.length/2;i++){
  10.             sb.append(array[i]);
  11.             try{
  12.                 sleep(100);
  13.             }catch(Exception e){
  14.             }
  15.         }
  16.     }
  17.     public void addRight(){
  18.         for(int i=array.length/2;i<array.length;i++){
  19.             sb.append(array[i]);
  20.             try{
  21.                 sleep(100);
  22.             }catch(Exception e){
  23.             }
  24.         }
  25.     }
  26.     public void run(){
  27.         
  28.         addleft();
  29.    
  30.         addRight();
  31.         
  32.         
  33.     }
  34.     public static void main(String[] args){
  35.         
  36.         Print a=new Print(new int[]{1,1,1,1,1,2,2,2,2,2});
  37.         Print b=new Print(new int[]{3,3,3,3,3,4,4,4,4,4});
  38.         
  39.         a.start();
  40.         b.start();
  41.         try{
  42.             a.join();
  43.             b.join();
  44.             
  45.         }catch(InterruptedException e){
  46.         }
  47.         System.out.println(sb);
  48.     }
  49. }
复制代码
请问这里应该怎么修改才可以输出"11111333332222244444" 呢??[s:3]
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复

使用道具 举报

8

主题

215

帖子

2223

积分

⑥精研

积分
2223
发表于 2007-11-13 14:07:32 | 显示全部楼层
延续楼主的思路的话,这样:
  1. class Print extends Thread{
  2.     int[] array;
  3.     static StringBuffer sb=new StringBuffer();
  4.     static Object ob=new Object();
  5.     public Print(int[] array){
  6.         this.array=array;
  7.     }
  8.     public void addleft(){
  9.         for(int i=0;i<array.length/2;i++){
  10.             sb.append(array[i]);
  11.         }
  12.         try{
  13.             sleep(100);
  14.         }catch(Exception e){
  15.         }
  16.     }
  17.     public void addRight(){
  18.         for(int i=array.length/2;i<array.length;i++){
  19.             sb.append(array[i]);
  20.         }
  21.         try{
  22.             sleep(100);
  23.         }catch(Exception e){
  24.         }
  25.     }
  26.     public void run(){
  27.         addleft();
  28.         addRight();
  29.     }
  30.     public static void main(String[] args){
  31.         
  32.         Print a=new Print(new int[]{1,1,1,1,1,2,2,2,2,2});
  33.         Print b=new Print(new int[]{3,3,3,3,3,4,4,4,4,4});
  34.         
  35.         a.start();
  36.         b.start();
  37.         try{
  38.             a.join();
  39.             b.join();
  40.             
  41.         }catch(InterruptedException e){
  42.         }
  43.         System.out.println(sb);
  44.     }
  45. }
复制代码
注意那两段sleep(100)的位置.或者把那两段sleep换成Thread.yield()也可以.

但是需要指明的是,这么做不是"线程安全"的.只使用sleep()或者yield无法保证执行顺序.在这里,虽然先调用了a.start(),但却无法保证a.run()在b.run()之前得到有效执行.虽然很难得一见b在a之前得到执行的状况,但它确实存在.
要保证执行顺序,最直观且有效的办法就是显式同步.不过在楼主给的这个例子里,强行通过同步来达到顺序没什么意义.如果是生产者-消费者/哲学家用餐之类的问题的话,还有点意义可言...
回复 支持 反对

使用道具 举报

50

主题

742

帖子

402

积分

版主

自定义头衔

Rank: 7Rank: 7Rank: 7

积分
402
发表于 2007-11-13 19:23:33 | 显示全部楼层
通常是WAIT等PV操作比较适用罢,也看具体情况了
Style-C
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-29 20:16 , Processed in 0.021994 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表