黑马程序员技术交流社区

标题: 今天遇到一个小难题,搞了几个小时了,搞不出来睡不着啊. [打印本页]

作者: 吴凯    时间: 2013-4-30 01:35
标题: 今天遇到一个小难题,搞了几个小时了,搞不出来睡不着啊.
本帖最后由 吴凯 于 2013-5-1 01:35 编辑

设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1,写出程序。
作者: 韩冬    时间: 2013-4-30 01:51
public class ThreadTest1{
private int j;
public static void main(String args[]){
ThreadTest1 tt=new ThreadTest1();
Inc inc=tt.new Inc();
Dec dec=tt.new Dec();
for(int i=0;i<2;i++){
Thread t=new Thread(inc);
t.start();
t=new Thread(dec);
t.start();
}
}
private synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
private synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
class Inc implements Runnable{
public void run(){
for(int i=0;i<100;i++){
inc();
}
}
}
class Dec implements Runnable{
public void run(){
for(int i=0;i<100;i++){
dec();






你测试一下,看是否正确.

作者: 吴凯    时间: 2013-4-30 02:25
韩冬 发表于 2013-4-30 01:51
public class ThreadTest1{
private int j;
public static void main(String args[]){

多谢 解决了
作者: 符立波    时间: 2013-4-30 09:49
呵呵,不错...........
作者: Sword    时间: 2013-4-30 11:30
  1. public class ThreadTest
  2. {
  3.      private int j;
  4.      public static void main(String[] args)
  5.      {
  6.          ThreadTest t = new ThreadTest();
  7.          Add add = t.new Add();
  8.          Sub sub = t.new Sub();
  9.          
  10.          for(int i=0;i<2;i++)
  11.          {
  12.              Thread t1 = new Thread(add);
  13.              t1.start();
  14.              Thread t2 = new Thread(sub);
  15.              t2.start();
  16.          }
  17.      }
  18.      
  19.      /*这里add方法和sub方法加synchronized关键字是因为当两个线程同时操作同一个变量时,
  20.       * 就算是简单的j++操作时,在系统底层也是通过多条机器语句来实现,所以在执行j++过程也是要耗费时间,
  21.       * 这时就有可能在执行j++的时候,另外一个线程H就会对j进行操作,因此另外一个线程H可能操作的可能就
  22.       * 不是最新的值了。因此要提供线程同步。
  23.       */
  24.      private synchronized void add()  
  25.      {
  26.          j++;
  27.          System.out.println(Thread.currentThread().getName()+":"+j);
  28.      }
  29.      
  30.      private synchronized void sub()
  31.      {
  32.          j--;
  33.          System.out.println(Thread.currentThread().getName()+":"+j);
  34.      }
  35.      
  36.      class Add implements Runnable
  37.      {
  38.          public void run()
  39.          {
  40.              for(int i=0;i<100;i++)
  41.              {
  42.                  add();
  43.              }
  44.          }
  45.      }
  46.      
  47.      class Sub implements Runnable
  48.      {
  49.          public void run()
  50.          {
  51.              for(int i=0;i<100;i++)
  52.              {
  53.                  sub();
  54.              }
  55.          }
  56.      }
  57. }
复制代码
代码和注释已经给出,希望对你能有所帮助
作者: wudongzhe    时间: 2013-4-30 15:36
  1. //设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1,写出程序。
  2. public class TestDemo2 {

  3.         public static void main(String[] args) {
  4.                 final ThreadDemo td=new ThreadDemo();
  5.                
  6.                 for (int i = 0; i < 2; i++) {
  7.                         new Thread(new Runnable() {
  8.                                 public void run() {
  9.                                         for (int i = 0; i < 10; i++) {
  10.                                                 td.inc();
  11.                                         }
  12.                                 }
  13.                         }).start();
  14.                 }
  15.                
  16.                 for (int i = 0; i < 2; i++) {
  17.                         new Thread(new Runnable() {
  18.                                 public void run() {
  19.                                         for (int i = 0; i < 10; i++) {
  20.                                                 td.doc();
  21.                                         }
  22.                                 }
  23.                         }).start();
  24.                 }
  25.                
  26.         }
  27. }

  28. //操作共享数据 可以封装在一个类中  在主方法中创建线程 调用 其 增 删方法
  29. class ThreadDemo{
  30.         int x=20;
  31.         public synchronized void inc(){
  32.                 System.out.println(Thread.currentThread().getName()+"....."+x--);
  33.         }
  34.         public synchronized void doc(){
  35.                 System.out.println(Thread.currentThread().getName()+"....."+x++);
  36.         }
  37. }
复制代码

作者: 黄玉昆    时间: 2013-4-30 23:16
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
作者: Super_Class    时间: 2013-5-1 00:09

public class MultiThreadShareData {
        public static void main(String [] args){
               
                final ShareData1 shareData1 = new ShareData1();
                for(int i=0;i<2;i++)
                        new Thread(new myRunnable1(shareData1)).start();
               
                for(int i=0;i<2;i++)
                        new Thread(new myRunnable2(shareData1)).start();
        }
}


class myRunnable1 implements Runnable{
        ShareData1 shareData1;
        public myRunnable1(ShareData1 shareData1){
                this.shareData1 = shareData1;
        }
        @Override
        public void run() {
               
                while(true){synchronized(shareData1){
                        System.out.print(Thread.currentThread().getName()+"....");
                        shareData1.increase();
                       
                        }
                }
                };

}

class myRunnable2  implements Runnable{
        ShareData1 shareData1;
        public myRunnable2(ShareData1 shareData1){
                this.shareData1 = shareData1;
        }
        public void run() {
               
                while(true){synchronized(shareData1){
                        System.out.print(Thread.currentThread().getName()+"....");
                        shareData1.decrease();
                }
                }
        };
}
class ShareData1{
        private int j=0;
       
        public synchronized void increase(){
               
                j++;
                System.out.println("increased After: "+j);
               
        }
        public synchronized void decrease(){
               
                j--;
                System.out.println("decreased After: "+j);
               
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2