关于基本多线程的机制和执行顺序

多线程:Java的线程机制是抢占式的。调度机 会周期性地中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片

抢占式:又称剥夺调度方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。

关于run( )方法的解释:

run()方法是不产生任何内在的线程能力。要实现线程行为,必须显示地将任务附着到线程上。即需将执行的任务代码块写进run()方法中,但直接调用run()方法是不能使线程进入就绪态的,即只是当作一个普通方法被调用,程序仍然是顺序执行,并没有产生并发(多线程运行),所以只能通过Start()方法来开启线程去执行run中的逻辑,例如将其提交给Thread构造器,调用thread.start()来在线程中启动该任务。

关于Start()方法的解释:

尽管start()看起来是产生了一个对长期运行方法的调用。实际上,start()产生的是对run()方法的调用。Start()方法会开启线程去执行run()中的方法,使线程进入就绪态,这时才真正实现了多线程运行,且无需等待run()方法体代码执行完毕而直接继续执行下面的代码。,这是是因为run()是由不同的线程执行的,因此依旧可以执行main()线程中的其他操作。 (不局限于main( )线程,任何线程都可以启动另一个线程)

即它在main()线程中启动线程时告诉处理机:“我开启了Start()为我去调用Run()方法吧”,在它等待处理机去调用Run( )的那一小会,此时在main( )线程中的其他操作可能就被执行了。


/**
 * 自定义的线程类
 */
class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("子线程"+i);
        }
    }
}
public class ThreadCreat {
    public static void main(String[] args) {
        MyThread mt=new MyThread();
        mt.start();
        for (int i = 0; i < 20; i++) {
            System.out.println(i+"主线程执行中...");
        }

    }
}
 输出结果:
0主线程执行中...
子线程0
子线程1
子线程2
子线程3
子线程4
子线程5
子线程6
子线程7
子线程8
子线程9
1主线程执行中...
2主线程执行中...
3主线程执行中...
4主线程执行中...
5主线程执行中...
6主线程执行中...
7主线程执行中...
8主线程执行中...
9主线程执行中...

在本例中,程序会同时运行两个方法,main()和MyThread.run()是程序中与其他线程"同时"执行的代码。

输出中可以看出
不同任务的执行在线程中被换出换进的交替执行着,这种交替是由线程调度器自动控制的,即 main()线程和MyThread.run()线程中的任务在交替执行,且每次执行结果可能是不同的。这是因为线程调度机制是非确定性的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值