如何深刻理解Java多线程?

如何深刻理解Java多线程?,第1张

线程是系统调度中的最小单位,因为其拥有比进程更小的资源消耗,因此,在进行同类事情,需要进行互相的通讯等等事情的时候,都采用线程来进行处理。

对于只做固定的一件事情(比如:计算1+2+3+...+9999999)来说,其性能上不会比采用单线程的整体效率高,原因是,同时都是要做这么多运算,采用多线程的话,系统在进行线程调度的过程中喙浪费一些资源和时间,从而性能上下降。

那么,多线程是否就没有存在的意义了呢?答案当然不是的。多线程还是有存在的价值的,我们在写输入流输出流,写网络程序等等的时候,都会出现阻塞的情况,如果说,我们不使用多线程的话,从A中读数据出来的时候,A因为没有准备好,而整个程序阻塞了,其他的任何事情都没法进行。如果采用多线程的话,你就不用担心这个问题了。还举个例子:游戏中,如果A角色和B角色采用同一个线程来处理的话,那么,很有可能就会出现只会响应A角色的操作,而B角色就始终被占用了的情况,这样,玩起来肯定就没劲了。

因此,线程是有用的,但也不是随便乱用,乱用的话,可能造成性能的低下,它是有一点的适用范围的,一般我认为:需要响应多个人的事情,从设计上需要考虑同时做一些事情(这些事情很多情况下可能一点关系都没有,也有可能有一些关系的)。

使用多线程的时候,如果某些线程之间涉及到资源共享、互相通讯等等问题的时候,一定得注意线程安全的问题,根据情况看是不是需要使用synchronized关键字。

以下全为个人理解,一个字一个字写哒

1.形象的比喻:

任何编程语言中,如JAVA

System.out.println("第一个线程")

System.out.println("第二个线程")

System.out.println("第三个线程")

普通的方法,这3行都是有顺序的,从上到下运行。

而如果使用多线程(代码较多,不贴出来了),那么以上3行可以同时运行,无须一行一行地排队运行。

2.官方的概念

在SUN的JAVA Tutorial中,多线程是Concurrency中的Multi-Threading(Thread翻译过来是线程)。Thread,象Process,但不同于Process(Process为程式,在ctrl+alt+del出来的任务管理器里的程序全属于Process)。Process费内存,费CPU等资源,而Thread可以说是轻量级的Process。一个Process里至少有一个Thread,可能有多个Thread。

3.实际应用

一个有Client-Server Model(客户端-服务器)的程序。服务器跟一个客户交流的时候,可能要花很常时间(如用户登陆,要费时间去查数据库)。难道让其它客户全都去等着?不行。所以为每个客户准备一个Thread,所有客户就可以同时跟服务器交流,互不干扰。

4.难题

Thread有利弊。线程在应用中,会有诸多问题,编程者必须注意。如:Thread Interference (两个线程互相干预)

Memory Consistency Errors (内存不一致)

Deadlock (死锁)

Starvation and Livelock (活琐)

这些都有解决方法,代码带多,不贴了,看参考资料吧!

java中多线程的实现方式有两种,一种是继承java.lang.Thread类,另一种是实现java.lang.Runnable接口。下面是两种方式的简单代码。继承Thread类方式:import java.lang.Thread//用集成Thread类方式实现多线程。 public class Test{ public static void main(String arg[]){ T t1=new T()T t2=new T()//更改新线程名称 t1.setName("t1")t2.setName("t2")//启动线程 t1.start()t2.start()} } class T extends Thread{ //重写run()方法 public void run(){ System.out.println(this.getName())} }输出结果为:t1t2实现Runnable接口方式:在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。import java.lang.*//用实现Runnable接口的方式实现多线程。 public class Test{ public static void main(String arg[]){ T t1=new T()T t2=new T()//一定要实例化Thread对象,将实现Runnable接口的对象作为参数传入。 Thread th1=new Thread(t1,"t1")Thread th2=new Thread(t2,"t2")//启动线程 th1.start()th2.start()} } class T implements Runnable{ //重写run()方法 public void run(){ System.out.println(Thread.currentThread().getName())} }输出结果为:t1t2public void run()方法是JAVA中线程的执行体方法,所有线程的操作都是从run方法开始,有点类似于main()方法,即主线程。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/209654.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-04
下一篇2023-04-04

发表评论

登录后才能评论

评论列表(0条)

    保存