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类,创建类对象,启动,买票,各个类对象之间互不侵犯票。

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张票

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,也是只有一个人卖票;

猜你喜欢

转载自blog.csdn.net/qq_29778641/article/details/81636123