当前位置:编程学习 > JAVA >>

问下有关java线程处理的一个问题

在java线程处理中,遇到一个问题,就是在main函数中,有三个线程t1,t2,t3,这三个线程为非后台程序,用来计算各个线程完成时间的,我们能大概知道线程完成时间t2<t1<t3,
问下为什么我在执行线程按照以下顺序
t1.Start();
t2.Start();
t3.Start();
结果却不正确,而当把顺序调为和三个线程执行完成时间一致时就没问题
t2.Start();
t1.Start();
t3.Start();
可以看出,这明显和线程的执行顺序有关
在java中,到底怎么才能保证所有的线程能正确完成而不受其它线程的影响?请高人指点
答案:
windows操作系统是以时间片轮转的方式来为线程分配CPU的处理能力.
所以在三个线程之间没有锁或者同步的情况下,三个线程都有能获得CPU的处理能力是并发的关系,但是这个能力是按照一个一个的时间片来分的,由于操作系统分配时间片的算法的原因导致三个线程获得时间片的数量不一定是相同的,所以你的测试方式是不准确的,不一定是时间最短的线程最先结算。如果你使用的是三核或四核的CPU,每一个线程都是并行运行的情况下测试才是正确的。

以下是在网上找到的一篇关于线程和进程运行的文章,你可以看一下。
进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;用户进程就不必我多讲了吧,所有由你启动的进程都是用户进程。进程是操作系统进行资源分配的单位。
在Windows下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。
在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。多任务带来的好处是明显的,比如你可以边听mp3边上网,与此同时甚至可以将下载的文档打印出来,而这些任务之间丝毫不会相互干扰。那么这里就涉及到并行的问题,俗话说,一心不能二用,这对计算机也一样,原则上一个CPU只能分配给一个进程,以便运行这个进程。我们通常使用的计算机中只有一个CPU,也就是说只有一颗心,要让它一心多用,同时运行多个进程,就必须使用并发技术。实现并发技术相当复杂,最容易理解的是“时间片轮转进程调度算法”,它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来 CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU。
 如果一台计算机有多个CPU,情况就不同了,如果进程数小于CPU数,则不同的进程可以分配给不同的CPU来运行,这样,多个进程就是真正同时运行的,这便是并行。但如果进程数大于CPU数,则仍然需要使用并发技术。
  在Windows中,进行CPU分配是以线程为单位的,一个进程可能由多个线程组成,这时情况更加复杂,但简单地说,有如下关系:
  总线程数<= CPU数量:并行运行
  总线程数> CPU数量:并发运行
  并行运行的效率显然高于并发运行,所以在多CPU的计算机中,多任务的效率比较高。但是,如果在多CPU计算机中只运行一个进程(线程),就不能发挥多CPU的优势。
这里涉及到多任务操作系统的问题,多任务操作系统(如Windows)的基本原理是:操作系统将CPU的时间片分配给多个线程,每个线程在操作系统指定的时间片内完成(注意,这里的多个线程是分属于不同进程的).操作系统不断的从一个线程的执行切换到另一个线程的执行,如此往复,宏观上看来,就好像是多个线程在一起执行.由于这多个线程分属于不同的进程,因此在我们看来,就好像是多个进程在同时执行,这样就实现了多任务.
同步方法synchronized,其实说白一点就是一个锁机制。你去银行取款,你的银行卡是你的KEY,你去取钱,用可KEY完成了,然后下一个人才可以用它的KEY去开门,然后关闭,如此循环。
楼上正解,另外,如果同时去开门会造成死锁,其实加锁了以后,并不是真正的同步执行了,而是这个CPU分配执行的时间,这个执行两下那个执行两下,给你的感觉是同时执行。
还有一点就是,双核处理器下和单核处理器下的运行是有差别的
加锁。还有我不明白你的意思,麻烦代码发下。

上一个:JAVA的自动内存管理是怎么回事
下一个:本人想找一个java培训班,人在北京,求推荐。

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,