初探多线程

多线程入门    

学生时代学习多线程的时候我是云里雾里,不知道现成的本质,进程和线程又有啥区别,只知道run方法里面就是多线程要做的事情,但是这个run方法的本质又是什么呢?

哪到底什么是线程呢

啥是线程?

  • 线程是操作系统能够进行运算的最小单位,他包含在实际的运作单位里面,是进程中的实际运作单位。

  • 程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点

  • 它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。线程也有就绪、阻塞和运行三种基本状态。我们通过多线程编程,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。

上面是“国际范的官方说明”,要我理解,操作系统是老大,线程就是个小喽啰。操作系统可以同时派多个小喽啰区干活。

线程和进程有什么区别?

  • 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据

  • 通信:不同进程之间通过IPC(进程间通信)接口进行通信。同一进程的线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

  • 调度和切换:线程上下文切换比进程上下文切换要快得多。

线程就是被包含在进程里面

使用多线程的好处是什么?

  • 在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态(提高CPU的利用率)。

  • 多个线程共享堆内存(heap memory),因此创建多个线程去执行一些任务会比创建多个进程更好。举个例子,Servlets比CGI更好,是因为Servlets支持多线程而CGI不支持。

但是我的理解是线程不是越多越快,线程是操作系统珍贵的资源,线程在达到一定状态时,cpu利用率达到100%,那么就是卡死,出现“摆工”的情况

,还有就是线程之间的切换时非常需要时间的,CPU在线程A执行了200ms,切换就要花掉比较多的时间,多说不宜,上代码

public class ConcurrencyTest {
private static final long count = 10000l;
public static void main(String[] args) throws InterruptedException {
concurrency();
serial();
}
private static void concurrency() throws InterruptedException {
long start = System.currentTimeMillis();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
int a = 0;
for (long i = 0; i < count; i++) {
a += 5;
}
}
});
thread.start();
int b = 0;
for (long i = 0; i < count; i++) {
b--;
}
long time = System.currentTimeMillis() - start;
thread.join();
System.out.println("concurrency :" + time+"ms,b="+b);
}
private static void serial() {
long start = System.currentTimeMillis();
int a = 0;
for (long i = 0; i < count; i++) {
a += 5;
}
int b = 0;
for (long i = 0; i < count; i++) {
b--;
}
long time = System.currentTimeMillis() - start;
System.out.println("serial:" + time+"ms,b="+b+",a="+a);
}
}

所以线程间的切换是需要时间的,那上面是线程间的切换呢:即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这
个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。

那么问题来了,多线程比单线程慢,那为啥还要多线程,我觉得凡事都有个度,在一定范围内,多线程肯定要快,但是线程越多就越慢,所以要合理利用线程。

那么怎么实现多线程呢

、如何在java中实现多线程

  • 在语言层面有两种方式。可以继承java.lang.Thread线程类,但是它需要调用java.lang.Runnable接口来执行。由于线程类本身就是调用的Runnable接口,所以你可以继承java.lang.Thread类或者直接调用Runnable接口来重写run()方法实现线程。

  • 还可以实现callable接口,和实现  Runnable接口一样。

  • 那么选择哪个更好?

    • 由于Java不支持类的多重继承,但允许调用多个接口。因此我们建议调用Runnable接口来创建线程.

还有通过Callable和Future创建线程,当然这种方法用的非常少。对了,今天是1024,祝所有程序猿没有bug,有bug也是秒解,就是这么皮。

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值