JAVA多线程相关总结

原文:http://www.cogu.cn/archives/167

什么是线程、什么是进程、它们的关系如何?

记得教科书上将,进程是线程的一次执行。其实,做了很多项目后,更直观的理解,一个应用就是一个进程,只是运行中的应用需要人为的去结束(出现异常除外)。在linux下, 我们经常用ps -ef|grep app 然后用kill -9 去结束一个应用的进程。线程是存在于进程之中的, 由进程去创建的,也就是应用创建的。每个进程至少包含一个进程,就是他的主进程,有main方法创建。

为什么使用多线程?

多线程可以使程序中的各个逻辑单元独立运行。可以并发的处理问题,提高CPU利用率,提高系统处理高访问量的能力。

多线程的创建方法

1、继承Thread类。
a.生成Thread类的子类。
class MyThread extends Thread
b.在子类中重写run()方法。
public void run()
c.生成子类的对象,并且调用start()方法启动新线程。
MyThread thread = new MyThread();thread.start();
start()方法将调用run()方法执行线程。继承Thread后重写父类里的run方法。将需要执行的逻辑放在里面即可。当run中的内容执行完毕以后, 线程就结束了。 如果想是一个线程持续工作,那就在run里放一个无限的循环即可。 并在适当的时候,使用sleep和wait、notify来暂停线程,从而起到定时执行的作用。2、实现Runnable接口。
a.定义一个类实现Runnable接口,
class MyThread implements Runnable
b.并且在该类中实现run()方法。
public void run()
c.生成这个类的对象。
FirstThread first = new FirstThread();
d.用Thread(Runnable target)构造函数生成Thread对象,然后调用start()方法启动线程。
Thread thread = new Thread(first);thread1.start();
Runnable接口中只有一个方法,那就是run方法。我们的核心逻辑就是现在run里的。其实Thread也是实现了Runable接口的。但Runable接口应用范围比较广,实现灵活。

几个比较重点的方法解释

start()启动一个线程,使其进入等待执行的状态,待线程获取了CPU以后,就能够进入运行状态。run()进入运行状态的线程,就会执行run方法里的逻辑。stop()已废弃,这个方法被废弃,原因是各个虚拟机对这个方法的实现没有统一的预期结果。yield()挂起线程,使线程回到待运行状态,CPU的时间片用完了就会执行这个方法。wait()等待,线程进入阻塞状态,线程里的run方法就不在运行了,直到notify和notifyAll方法调用它们,线程才会回到待运行状态。notify()/notifyAll():换醒阻塞状态的线程,进入待运行状态。sleep()和等待类似, 只是sleep能够指定阻塞时间,时间结束后,就进入了待运行状态。join()能够是当前线程在执行中不会被挂起或阻塞,知道线程执行完才行。

分享线程状态图

线程的同步

使用synchronized关键字,将需要同步的方法和代码块标记后,就只能被一个线程所访问。使用wait和notify结合synchronized关键字使用,减少程序间的相互干扰。使用局部变量,避免使用成员变量。使用JDK中java.util.concurrent包中的线程安全类, 如ConcurrentHashMap、CopyOnWriteArrayList等。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值