线程机制原理是什么?如何使用Executor?

SpringBoot整合SpringCloud实战开发系列教程(精品不容错过)

在实际程序设计中,如果不用并发,问题很难解决,比如仿真系统。在仿真程序中,我们通常将每个元素都设置问一个任务,通过一个个线程去执行,这样就容易实现很多。

Java程序中,线程是抢占式的,假如有两个线程,也就意味着每个线程都会周期性中断,从切换到另一个线程。在用到消息中间件的系统中,并发通常是必备的要点,消息中间件作为共享资源,可以有效的管理并发消息。

线程机制原理是什么?如何使用Executor?

线程机制原理是什么?

在实战中,我们进行并发编程,通常都是将整个程序分作为主任务,然后把主任务分为多个子任务去执行,每个子任务都交给一个线程来驱动,一个进程通常可以包含多个线程,表面上看起来,每个任务都好像是独立的cpu一样,但实际上,每个任务之间的切换都是通过切分cpu时间来实现的。如果是多处理器,那就是另当别论了,多处理器可以加快程序的执行速度,但是作为线程而言,它不需要关心底层到底是单处理器还是多处理器,它只需要关心自己执行的任务,所以说,多线程和多任务是的多处理器的性能得到极大的发挥。

创建一个线程,主要通过实现runnable接口和继承thread类两种方式实现。前者需要实现接口中的run方法,示例如下:

public class TestTask implements Runnable {

protected int a = 10;

private static int b = 0;

public void run(){

System.out.print(a+b);

Thead.yield();

}

}

Run方法中的Tread.yield()作用是线程调度器的生命,意识是告诉程序,现在可以将CPU切换给另一个线程了,但这个代码不是必须要写的。

线程机制原理是什么?如何使用Executor?

Run()方法也可以直接被调用,但是直接被调用,就不能作为线程来使用了。

比如:

pulic class main {

TestTask test = new TestTask();

test.run();

}

如果要作为线程来使用,就必须将一个任务加线程上面,这就需要用到Thread类。

比如:

pulic class main {

Thread th = new Thread(new TestTask());

th.start();

}

Thread.start()方法主要是启动线程并初始化,run()方法是随后执行的。

线程之间的切换和调度都是通过线程调度器来实现的,它会给处理器分发线程。线程调度器具有不确定性。

如何使用Executor?

Executor主要用来管理Thread类,使用它可以极大的方便我们编程。如果不使用Executor,客户端将直接执行任务,但是如果使用Executor,它可以帮助我们执行任务,所以说,它是客户端和任务之间的桥梁,而且Executor还支持异步执行任务,所以执行任务优先使用Executor。

线程机制原理是什么?如何使用Executor?

Executor可以创建Thread对象,ExecutorService来执行Runnable对象,通常我们使用线程池,来为每个任务创建线程。

代码示例如下:

……

ExecutorService e = Executors.newCachedThreadPool();

for(int j = 0; j < 6 ; j++){

e.execute(new new TestTask());

}

e.shutdown();

……

调用shutdown()方法,可以保证在shutdown()调用之前的任务全部执行完。

我们也可以把newCachedThreadPool()换成其他线程池,比如FixedThreadPool。CachedThreadPool 会创建和任务数量相同的线程,可以节约资源,所以一般首选这个线程池,如果CachedThreadPool遇到问题,就需要切换到其他线程池,一般选择FixedThreadPool。FixedThreadPool线程池会创建固定数量的线程,一次性线程分配资源消耗比较大,但是会节约创建线程开销。

还有一种线程池叫做SingleThreadExecutor,它的线程数量为1,这种线程池也可以转型多任务,但是需要按照顺序排队执行,所以这种线程池通常使用在日志,监听,文件资源获取等场景中。

比如我们有很多并发的任务要同时获取文件资源,我们有两种方式,一种是通过在资源代码上加同步,一种就是使用SingleThreadExecutor,这种方式可以有序的安排线程获取资源,确保同一时刻只有一个任务在单线程中运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓凡学院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值