java基础之多线程1——初识多线程

#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让给其他线程,并不释放所持有的对象锁,休眠时间结束后线程回到就绪状态————这里的释放对象锁是谁释放?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值