java中main为主线程,也可以增加线程。如果程序中有多个线程。
1、这些线程是怎样调用执行的呢?
2、几个线程顺序是怎样的,与什么有关?(我们可以通过方法设置线程的优先级,顺序和优先级有关吗?)
3、先运行谁,后运行谁?又取决于什么?
1、这些线程是怎样调用执行的呢?
2、几个线程顺序是怎样的,与什么有关?(我们可以通过方法设置线程的优先级,顺序和优先级有关吗?)
3、先运行谁,后运行谁?又取决于什么?
调试欢乐多
线程是需要得到处理器分给的时间片才能执行的,线程执行是没有确定顺序的,优先级及一些方法也只是改变执行的几率而已。先运行谁、后运行谁没有确定的顺序。不同的环境(比如不同的操作系统)调度方式都不同,所以不能确定。传统的单核cpu在一个时间点上只能运行一个线程,而双核理论上可以同时运行两个线程。
package thread;public class ProducerAndCustomerDemo {
public static void main(String[] args) {
Queue q=new Queue();
Productor p=new Productor(q);
Customer c=new Customer(q);
p.start();
c.start();
}
}
class Customer extends Thread{
Queue q;
public Customer(Queue q) {
// TODO Auto-generated constructor stub
this.q=q;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (q.value<10) {
System.out.println("Customer get "+q.get());
}
}
}
class Productor extends Thread{
Queue q;
public Productor(Queue q) {
// TODO Auto-generated constructor stub
this.q=q;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 1; i <=10; i++) {
q.put(i);
System.out.println("Productor put "+i);
}
}
}
class Queue{
int value;
boolean bFull=false;
public synchronized void put(int i){
if (!bFull) {
value=i;
bFull=true;
//notify();
notifyAll();
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public synchronized int get(){
if (!bFull) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
bFull=false;
notifyAll();
return value;
}
}
单核处理器实际上采用了超线程技术,理论上就像多线程一样,并行运作,实际上,只是在一个CPU里面多加了一个逻辑处理单元,但是整数运算单元,浮点运算单元,二级缓存都是共享的,所以一旦两个线程遇到一个资源的时候就必须停止其中一个,等待另外一个执行完才可以继续执行。也就是说单核CPU没有做到资源的共享。
但是双核处理器就不一样了,每个核心都有自己独立的指令集,执行单元,所以实实在在的实现了两个线程并行工作。举个例子吧,单核CPU就像一个人有一个大脑两个小脑,而双核CPU就是一个人有两个大脑
由于有两个CPU,故可同时执行两个线程。具体的调度是OS设定的可以保证程序的正常。
FIFO 先入先出原则.首先请求服务的对象首先得到CPU的处理.
最短作业优先原则:需要最小时间的服务首先得到处理.
最高优先级原则:优先级最高的服务首先得到处理.
时间轮片原则: 每个任务分配一个系统时间片.轮流执行.
最短剩余时间优先原则.