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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔洪全 中级黑马   /  2012-11-18 08:40  /  1784 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 秦祥林 于 2012-12-1 11:46 编辑

曾经去一家公司笔试的题,简单的做出来了,可惜结果不理想
题目:启用两条多线程,一条线程实现变量 NO 加一,另一条实现变量 NO 减二。打印结果

5 个回复

倒序浏览
class TestAdd implements Runnable
{
        public void run(){
                Test.testNumber = Test.testNumber+1;
                System.out.println(Test.testNumber);
        }
}
class TestDecrease implements Runnable
{
        public void run(){
                Test.testNumber=Test.testNumber-1;
                System.out.println(Test.testNumber);
        }
}

public class Test
{
        public static int testNumber = 4;
        public static void main(String[] args) throws Exception
        {
                TestAdd td = new TestAdd();
                new Thread(td).start();
                new Thread(td).start();
               
                System.out.println("testNumber="+testNumber);
        }
}
这是我做的,感觉输出有问题

点评

这个其实考得是多线程安全问题,必须先加了再减,使用锁开控制线程吧  发表于 2012-11-18 08:59

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
加上synchronized 或者luck锁试试吧。
回复 使用道具 举报
  1. import java.util.concurrent.Executors;
  2. import java.util.concurrent.ScheduledExecutorService;
  3. import java.util.concurrent.TimeUnit;

  4. public class TwoThreadAddAndMinus {

  5.         public static void main(String[] args) {
  6.                 ScheduledExecutorService ea = Executors.newSingleThreadScheduledExecutor();
  7.                 ea.scheduleAtFixedRate(new TestAdd(), 0, 2, TimeUnit.SECONDS);
  8.                 ScheduledExecutorService em = Executors.newSingleThreadScheduledExecutor();
  9.                 em.scheduleAtFixedRate(new TestMinus(), 0, 5, TimeUnit.SECONDS);
  10.         }

  11. }
  12. class TestAdd implements Runnable
  13. {
  14.         public void run(){
  15.                 Num.Add(1);
  16.         }
  17. }
  18. class TestMinus implements Runnable
  19. {
  20.         public void run(){
  21.             Num.Minus(2);
  22.         }
  23. }
  24. class Num{
  25.         private static int num = 10;
  26.         public synchronized static void Add(int i){
  27.                 num += i;
  28.                 System.out.println(num);
  29.         }
  30.         public synchronized static void Minus(int i){
  31.                 num -= i;
  32.                 System.out.println(num);
  33.         }
  34. }
复制代码
synchronized方法
或者
  1. package com.test1;

  2. import java.util.concurrent.Executors;
  3. import java.util.concurrent.ScheduledExecutorService;
  4. import java.util.concurrent.TimeUnit;

  5. public class TwoThreadAddAndMinus {

  6.         public static void main(String[] args) {
  7.                 ScheduledExecutorService ea = Executors
  8.                                 .newSingleThreadScheduledExecutor();
  9.                 ea.scheduleAtFixedRate(new TestAdd(), 0, 2, TimeUnit.SECONDS);
  10.                 ScheduledExecutorService em = Executors
  11.                                 .newSingleThreadScheduledExecutor();
  12.                 em.scheduleAtFixedRate(new TestMinus(), 0, 5, TimeUnit.SECONDS);
  13.         }

  14. }

  15. class TestAdd implements Runnable {
  16.         Num n = Num.getInstance();
  17.         public void run() {
  18.                 synchronized (n) {
  19.                         n.Add(1);
  20.                 }
  21.         }
  22. }

  23. class TestMinus implements Runnable {
  24.         Num n = Num.getInstance();
  25.         public void run() {
  26.                 synchronized (n) {
  27.                         n.Minus(2);
  28.                 }
  29.         }
  30. }

  31. class Num {
  32.         private static int num = 10;
  33.         private static Num instance = null;

  34.         private Num() {

  35.         }

  36.         public static Num getInstance() {
  37.                 if (instance == null)
  38.                         instance = new Num();
  39.                 return instance;
  40.         }

  41.         public void Add(int i) {
  42.                 num += i;
  43.                 System.out.println(num);
  44.         }

  45.         public void Minus(int i) {
  46.                 num -= i;
  47.                 System.out.println(num);
  48.         }
  49. }
复制代码
synchronized块 相当于加锁

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
非常感谢同学的回答,感谢古老师
回复 使用道具 举报
class TestAdd implements Runnable
{
        public void run(){
                while(true)
                {
                Test.NO= Test.NO+1;
                System.out.println(Test.NO);
                }
        }
}
class TestDecrease implements Runnable
{
        public void run(){
                while(true)
                {
                Test.NO=Test.NO-1;
                System.out.println(Test.NO);
                }
        }
}

public class Test
{
        public static int NO=123;
        public static void main(String[] args) throws Exception
        {
                TestAdd td = new TestAdd();
                TestDecrease tt = new TestDecrease();
                new Thread(td).start();
                new Thread(tt).start();
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马