#0.声明
此多线程的学习来自——skywang12345(如果天空不死)——的博客
https://www.cnblogs.com/skywang12345/p/java_threads_category.html
大牛啊,,,
#1.线程的几种状态
新建状态:创建你的军队,横扫天下 Thread t1 = new Thread(); 就绪状态:可以被cpu调度执行的状态,全军准备出击状态 t1.start(); 运行态: 获得cpu使用权限,全军出击状态; 死亡状态: 结束run(),军队完成使命,over。 阻塞态:被迫放弃cpu使用权,直到进入就绪态;——被夺了权的岳飞啊。 (01) 等待阻塞 -- 通过调用线程的wait()方法,让线程等待某工作的完成。——吃完饭出击 (02) 同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。——等待斥候的情报 (03) 其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。 ##额,我这么抄真的能变强么??还是当成笔记吧。 #2.常用的实现多线程的两种方式 ####2.1此外,Runnable还可以用于“资源的共享”。即,多个线程都是基于某一个Runnable对象建立的,它们会共享Runnable对象上的资源。 啥意思?一个类implements Runnable,然后在其中创建了多个Thread对象? 应该是创建implements Runnable的类对象,然后建立多个thread对象,多个thread和一个类对象相互关联。 ####2.2继承thread类,创建类对象,启动,买票,各个类对象之间互不侵犯票。 ```java public class ThreadTest extends Thread private int ticket=10; main(){ ThreadTest tt1 = new ThreadTest(); ThreadTest tt2 = new ThreadTest(); ThreadTest tt3 = new ThreadTest(); tt1.start(); tt2.start(); tt3.start(); } ``` 这个例子一共买票30张。 **但是,ticket加上static,变身类对象,就会只卖10张票。** ####2.3实现runnable的类,创建1个类对象3个线程, ticket没有static,只卖10张票,说明资源共享。 但是,所有的对象都资源共享么?——答:是的! 为什么?因为他只创建了一个类对象啊!你就算启动了1w个线程,但是大家都作用在这个类对象上,当然资源共享了。 注意二者(继承和接口)输出线程名的不同。 this.getName(); Thread.currentThread().getName(); ####2.4 给run方法加上synize,哪个线程拿到锁,哪个线程就卖完所有的票 public synchronized void run() 运行结果是:全部0线程卖票。 ####2.5 让3个线程一起卖10张票 ```java public void run(){ for(int i=0;i<20;i++){ synchronized(this){ if(ticket>0){ System.out.println(Thread.currentThread().getName()+" 卖票:ticket"+ticket--); System.out.println(Thread.currentThread().getName()+"-"+i1++); } } } } ``` 这样是可能的,如果synchronized放在run之下,for之上,那么只能有一个卖票; 如果加上sleep,也是只有一个人卖票;
Java多线程系列–“基础篇”05之 线程等待与唤醒
notify() – 唤醒在此对象监视器上等待的单个线程。
notifyAll() – 唤醒在此对象监视器上等待的所有线程。
对象监视器什么东东??如何监视?
答:谁执行了对象.wait(),那么谁就是要休眠的线程,对象就是对象监视器。
wait(),从就绪态进入阻塞态,调用notify,进入就绪态。
在main中,t1调用wait(),为什么是main线程阻塞?
t1.start();t1线程进入就绪态,但是,在main中,只有一个main线程,t1线程只有进入t1自己的run中才算t1线程,否则只是对象。
我一直都不明白线程和对象的关系。
当synchronized出现时,需要获取此对象实例的锁,锁给了当前线程
,而不是当前实例,虽然是当前实例调用synchronized方法。——这是单线程同步方法。
sleep()方法是线程类Thread的静态方法,调用该方法使线程暂停执行指定的时间,将CPU让给其他线程,并不释放所持有的对象锁,休眠时间结束后线程回到就绪状态————这里的释放对象锁是谁释放?