多线程入门使用以及线程状态

JavaThead

1、常用方法

1.1 创建新建线程并启动
   //法一:
    class PrimeThread extends Thread {
        //构造函数
         PrimeThread() {
         }
		//run方法一定要重写
         public void run() {
         }
     }
	//启动
     PrimeThread p = new PrimeThread();
     p.start();

//法二:是先实现runnable接口,在作为target传入Thead运行
 class PrimeRun implements Runnable {
	...
 }
//启动
 PrimeRun p = new PrimeRun();
     new Thread(p).start();  //p作为参数传入Thead运行

1.2 方法
1、构造函数
Thread() 
//分配一个新的 Thread对象。
Thread(String name) 
//分配一个新的 Thread对象
Thread(ThreadGroup group, Runnable target, String name) 
//分配一个新的 Thread对象,使其具有 target作为其运行对象,具有指定的 name作为其名称,属于 group引用的线程组。
2、线程方法
	getId() 
返回此线程的标识符。 
    getName() 
返回此线程的名称。
    getState() 
返回此线程的状态。
    setPriority(int newPriority) 
更改此线程的优先级。 
    sleep(long millis) 
使当前正在执行的线程以指定的毫秒数暂停,当前线程进入TIMED_WAITING状态,millis后线程自动苏醒进入就绪状态。
    yield() 
对调度程序的一个暗示,即当前线程愿意让出当前使用的处理器,调度程序重新选择运行的线程。 
    join()
让线程进入等待
1.3 线程状态
  • 线程状态。线程可以处于以下状态之一:

    • NEW
      新建了线程对象但尚未启动处于此状态。 即还没有调用start()方法。

    • RUNNABLE
      在Java虚拟机中执行的线程处于此状态。

      Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
      线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。
      就绪状态的线程在获得CPU时间片后变为运行中状态(running)。

    • BLOCKED
      表示线程阻塞于锁。等待获取锁的状态

    • WAITING
      进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
      当前线程调用其他线程的 thread.join() 方法时,当前线程进入该状态
      处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。

    • TIMED_WAITING
      正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
      超时等待状态,该状态不同于WAITING,它可以在指定的时间后自行返回。
      当前线程调用其他线程的 thread.join(long millis) 方法时,当前线程进入该状态
      当前线程主动调用 sleep(long millis) 方法也进入此种状态
      处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。

    • TERMINATED
      已退出的线程处于此状态

    线程状态图:
    img

    1.4 锁有关

    1、thread.join()/thread.join(long millis),当前线程里调用其它线程t的join方法,当前线程进入WAITING/TIMED_WAITING状态,当前线程不会释放已经持有的对象锁。线程t执行完毕或者millis时间到,当前线程一般情况下进入RUNNABLE状态,也有可能进入BLOCKED状态(因为join是基于wait实现的)。

    join方法的原理就是调用相应线程的wait方法进行等待操作的,例如A线程中调用了B线程的join方法,则相当于在A线程中调用了B线程的wait方法,当B线程执行完(或者到达等待时间),B线程会自动调用自身的notifyAll方法唤醒A线程,从而达到同步的目的。

    2、obj.wait(),当前线程调用对象的wait()方法,当前线程释放对象锁,进入等待队列。依靠notify()/notifyAll()唤醒或者wait(long timeout) timeout时间到自动唤醒。
    3、obj.notify()唤醒在此对象监视器上等待的单个线程,选择是任意性的。notifyAll()唤醒在此对象监视器上等待的所有线程。
    4、LockSupport.park()/LockSupport.parkNanos(long nanos),LockSupport.parkUntil(long deadlines), 当前线程进入WAITING/TIMED_WAITING状态。对比wait方法,不需要获得锁就可以让线程进入WAITING/TIMED_WAITING状态,需要通过LockSupport.unpark(Thread thread)唤醒。

    参考:
    https://blog.csdn.net/pange1991/article/details/53860651

2、线程暂停与恢复、停止

2.1过时方法:
thead.suspend(); //暂停
thead.resume();	//恢复
2.2常用技巧:
  • 线程内一般用while循环加一个运行标志,设置运行标志为false即可让线程
    自动运行结束,终止,等待回收。不要主动去stop线程。
  • 想要重复利用一个线程而又实现暂停效果,就可以用两层while循环,第一层为while(true),
    第二层为while(flag), 在第二层中实现特定功能,当flag为flase时,不执行特定功能,实现暂停线程的效果(但实际上线程一直在运行)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值