java多线程问题-有一道Java面试题,没太理解明白,求大神指点啊~

问题描述

有一道Java面试题,没太理解明白,求大神指点啊~

package test2;
/**

  • 设计4个线程,其中两个线程每次对i增加1,另外两个线程对i每次减少1
  • @author liuyu
    *
    */
    public class Test {

    private int i ;

    private synchronized void inc(){

    i ++;

    System. out .println(Thread.currentThread().getName()+ "--inc--" + i );

    }

    private synchronized void dec(){

    i --;

    System. out .println(Thread.currentThread().getName()+ "--dec--" + i );

    }

    class Inc implements Runnable {

    public void run() {

    inc();

    }

    }

    class Dec extends Thread{

    public void run() {

    dec();

    }

    }

    public static void main(String[] args) {

    Test t = new Test();

    Inc inc = t. new Inc();

    Thread thread = null;

    // 创建 2 个增加线程

    for ( int i = 0; i < 2; i++) {

    thread = new Thread(inc);

    thread.start();

    }

    // 创建 2 个减少线程

    for ( int i = 0; i < 2; i++) {

    thread = t.new Dec();

    thread.start();

    }

    }

    }

输出:Thread-0--inc--1
Thread-3--dec--0
Thread-2--dec---1
Thread-1--inc--0

可是我感觉应该输出是:
Thread-0--inc--1
Thread-1--inc--2
Thread-2--dec--1
Thread-3--dec--0

因为按照执行顺序,当执行第一个for循环第一次的时候创建第一个线程,并且i加1,执行第二次for循环的时候i再加1等于2;
执行第二个for循环的时候,创建第三个线程,并且i减1,执行第二次的后事i再减1等于0

为什么不对呢?

解决方案

卤煮的想法没错,程序确实是一步一步从上往下执行的,也创建了四个线程,之所以没有出现预期的结果,可能是有一点被忽略了,java中的线程有自己的生命周期,一个新的线程会经历创建、就绪然后才能进入执行状态。也就是说你的程序创建了四个线程,它们只是进入了就绪状态,等待cpu线程栈的调度,而何时可以得执行以及执行的顺序还要依赖cpu的性能、cpu的个数等等。所以程序的输出结果应该是未知的,卤煮可以多跑几次,应该会输出不同内容。嘿嘿。

解决方案二:

http://zhidao.baidu.com/link?url=eZLAOwSTwVHWY39P8YLk07kAmf3hjS5IQ0hTXqyfgKFKNzqPqdVPk7gKbCB7T0VixUrKzl8BxJI8QVi2PagUKK

解决方案三:

这是不是跟线程状态有关系呢?
你只是把线程start了,并不是直接计算了,可能当时线程并没有开始计算。
如果多调用几次应该每次结果都不一样吧?
我只是提供个思路,毕竟我也不是很清楚。sorry

解决方案四:

这个你应该能搜到,讲解的就是java的线程同步问题,很经典的套路

解决方案五:

我知道例子,我想问的是 为什么每次执行结果顺序不一样呢?我想问的是这个 ,继续求解答,,

解决方案六:

四个线程的启动可以认为是同时发生的(间隔时间非常短),线程并发并不代表线程会同时执行(可以百度下并发和并行的区别)。
CPU个数是限制,例如在单核CPU上,同一时间只能将cpu分配给某一个线程执行,这就是所谓的资源竞争,而竞争的结果不一定是相同的。
所以四个线程执行顺序不可预期。

解决方案七:

cpu执行哪个,是有时间片的,虽然创建了一个线程,但是线程并不一定会立即被cpu运行,所以可能在等待时间片。
所以也不一定结果就是 1 0 1 0,也有可能是 1 2 1 0
你要想输出结果一定,就需要做线程的同步,保证某个线程先执行,另外一个线程再执行

解决方案八:

是的,从程序流程来看,该是你说的结果。但是,线程创建、启动后,并不是马上就执行你的业务逻辑,至于哪个先执行,是需要进行调度的,由于不确定性,结果也是会不一样的。可以借助线程的join()或者优先级等,来提高优先执行顺序,以达到预期效果。

时间: 2024-12-12 09:07:00

java多线程问题-有一道Java面试题,没太理解明白,求大神指点啊~的相关文章

关于java 快速排序问题 这个输出报错 我认为 while 有问题 求大神指导

问题描述 关于java 快速排序问题 这个输出报错 我认为 while 有问题 求大神指导 package QuickSort; import java.util.ArrayList; public class QuickSort { public static void main(String[] args) { ArrayList<Integer> lists = new ArrayList<Integer>(); lists.add(5); lists.add(2); lis

对java中递归问题的输出不理解,求大神解答!谢谢

问题描述 对java中递归问题的输出不理解,求大神解答!谢谢 对于这一段代码我能够理解,压栈然后出栈就是6,5,4 package recursion; public class testRecursion { public static void main(String[] args) { int num=3; recursion(num); } private static void recursion(int n){ n++; if(n<7){ recursion(n); System.o

用java实现这个计算器为什么不能用(点击按钮为啥没反应),求大神解答??

问题描述 用java实现这个计算器为什么不能用(点击按钮为啥没反应),求大神解答?? import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JP

cpu-怎么用java获取非本机的CPU使用率和硬盘占有率?求大神指点!在线等!

问题描述 怎么用java获取非本机的CPU使用率和硬盘占有率?求大神指点!在线等! 可以获取本电脑的CPU使用率,不过获取他人的电脑的CPU使用率呢? 解决方案 这个一般是通过SNMP,WMI等方式,需要远程电脑上有安装对应的服务等 解决方案二: 请问需要安装什么服务?用java代码可以实现对非本机的CPU使用率的获取吗?谢谢啦!

java如何仅用java.io.*包和数组实现这道题?菜鸟新学,求大神指点

问题描述 java如何仅用java.io.*包和数组实现这道题?菜鸟新学,求大神指点 能在dos运行就行.菜鸟新学,求大神指点. 解决方案 为什么要使用数组呢,感觉List 或 Map 这两个类或其子类实现这个功能更好 解决方案二: Java之美[从菜鸟到高手演变]之Java中的IO 解决方案三: 既然用数组就用数组好了,一共四个数组分别存储雇员的姓名,基本工资,浮动工资和支出,每输入一次往数组中添加记录即可.

java-Java中多线程同步锁报无效指针异常是何原因,求大神解答!

问题描述 Java中多线程同步锁报无效指针异常是何原因,求大神解答! /* 需求: 使用lock接口实现商品的生产和销售的动态平衡 思路: 1.创建被共同操作的数据类Resource,并通过多态引用分别创建lock和condition子类对象以及资源的获取和赋值方法 2.创建两个相反操作即生产和销售的类同时实现Runnable接口,并覆盖run方法 3.在主函数中,创建资源对象,并作为共同参数分别传递给生产和销售两个线程实现类的构造函数 4.分别将生产和销售类的对象作为参数,传给两个线程,并各自

多线程测试类,运行找不到main方法,求大神洞悉问题

问题描述 多线程测试类,运行找不到main方法,求大神洞悉问题 public class hello { static class hello1 extends Thread { public hello1() { } public hello1(String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 " +

java容器 collection-JAVA中什么是容器?什么是集合?求大神指导

问题描述 JAVA中什么是容器?什么是集合?求大神指导 容器是什么?跟接口是什么关系?集合又是什么?求大神帮忙?????? 解决方案 Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),AttributeList(1.5),RoleList(1.5),RoleUnresolvedList(1.5), ConcurrentLinkedQueue(1.5),Ar

关于java中用JNative调用dll文件报错的问题,跪求大神解决

问题描述 我在Eclipse中新建一个java工程,在java文件中用JNative调用dll文件,我把JNativeCpp.dll放在的C:WindowsSystem32中,把JNative.jar放在C:ProgramFilesJavajre7libext中,可是运行的时候总是报错JNativelibrarynotloaded,sorry!求解决啊,弄了一下午了,快死人了,还没调出来! 解决方案 解决方案二:JNativeCpp.dll放在的C:Windows下试试