最近复习了一些多线程方面的基础知识,做一下总结,多以自己的理解来文字叙述,如果有漏点或者理解错的地方,欢迎各位大佬多多指出;

ps:线程分为用户线程和守护线程,当程序中的所有的用户线程都执行完了之后,JVM就退出运行了,下面所讲的都是用户线程为例,我们一般创建一个新线程对象,默认都是用户线程,当然,我们可以手动调用setDeamon(true);置为守护线程;这个涉及到线程优先级的问题了,后面会详细说明;

线程的生命周期:

1. 新建状态(New)  : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。
2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后,其它线程调用了该对象的start()方法,从而来启动该线程。例如,thread.start()。处于就绪状态的线程,随时可能被CPU调度执行。
3. 运行状态(Running) : 线程获取CPU权限进行执行。需要注意的是,线程只能从就绪状态进入到运行状态。
4. 阻塞状态(Blocked)  : 阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
    (01) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。
    (02) 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
    (03) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5. 死亡状态(Dead)    : 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

实现多线程的方式有两种:继承Thread类和实现Runnable接口,继承和实现各有各的特点,怎么选择可根据业务来决定,一般为了更好的扩展都是选择实现Runnable接口;

// 实现Runnable的方式
class MyThread implements Runnable{
private int ticket=;
public void run(){
for(int i=;i<;i++){
if(this.ticket>){
System.out.println(Thread.currentThread().getName()+" 卖票:ticket"+this.ticket--);
}
}
}
}; public class RunnableTest {
public static void main(String[] args) {
MyThread mt=new MyThread(); // 启动3个线程t1,t2,t3(它们共用一个Runnable对象),这3个线程一共卖10张票!
Thread t1=new Thread(mt);
Thread t2=new Thread(mt);
Thread t3=new Thread(mt);
t1.start();
t2.start();
t3.start();
}
}
// 继承Thread类的方式
class MyThread extends Thread{
private int ticket=;
public void run(){
for(int i=;i<;i++){
if(this.ticket>){
System.out.println(this.getName()+" 卖票:ticket"+this.ticket--);
}
}
}
}; public class ThreadTest {
public static void main(String[] args) {
// 启动3个线程t1,t2,t3;每个线程各卖10张票!
MyThread t1=new MyThread();
MyThread t2=new MyThread();
MyThread t3=new MyThread();
t1.start();
t2.start();
t3.start();
}
}

其中如果是选择继承Thread类的方式的话,因为每new一个线程对象,都会产生一个独立的对象,所以每个对象都会执行10次循环;

实现runnable接口,三个线程共享一个MyThread对象,所以3个线程一共执行10次循环;

最新文章

  1. vcpu
  2. Echarts使用
  3. Android BLE 蓝牙编程(一)
  4. [09]APUE:进程关系
  5. centos6.4 搭建svn服务器
  6. linux程序调试命令strace
  7. nodejs的第一天学习笔记
  8. java面向对象中的String类中12种常用的方法
  9. hdu 1240 Asteroids!(BFS)
  10. java的string.split()分割特殊字符时注意点
  11. 20175204 张湲祯 2018-2019-2《Java程序设计》第三周学习总结
  12. 生成器函数yield
  13. js处理异步的几种方式
  14. GCC&amp;&amp;GDB在OI中的介绍
  15. Python开发环境搭建指导
  16. Ubuntu软件更新时出错问题解决
  17. 一. Selenium介绍
  18. [New learn]@class和#import的区别使用
  19. Win10注销在哪?怎么注销电脑
  20. javascript对下拉列表框(select)的操作

热门文章

  1. CVE-2015-1642 POC
  2. 在Ubuntu16.04.4上安装docker
  3. 08提权 系统文件权限和远程连接IP绕过 安装后门
  4. Python迭代(入门8)
  5. IM
  6. 整理了一下关于KVO的姿势
  7. isset() 与 array_key_exists() 比较
  8. mybatis逆向工程mbg
  9. java的foreach,后台弹框
  10. ringMVC——redirect重定向跳转传值