Java多线程学习

先不扯淡什么鬼的理论,先把多线程给跑起来再说了。
通常认为实现多线程有两种方式(其实用三种实现方式,暂不讨论)
第一种是直接继承Thread
直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package pw.gouzai.main.Interview.multithreading;

public class MultithreadingDemo_Thread extends Thread{

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 5; i++) {
System.err.println(Thread.currentThread().getName() + "-->"+i);
}
}

public static void main(String[] args) {
MultithreadingDemo_Thread demo = new MultithreadingDemo_Thread();
MultithreadingDemo_Thread demo1 = new MultithreadingDemo_Thread();
demo.start();
demo1.start();
}

}

先把demo跑起来再说。
结果如下:

1
2
3
4
5
6
7
8
9
10
Thread-0-->0
Thread-1-->0
Thread-0-->1
Thread-0-->2
Thread-1-->1
Thread-0-->3
Thread-1-->2
Thread-1-->3
Thread-1-->4
Thread-0-->4

第一种是现实Runnable接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MultithreadingDemo_Runnable implements Runnable{

public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 5; i++) {
System.err.println(Thread.currentThread().getName() + "-->"+i);
}
}

public static void main(String[] args) {
MultithreadingDemo_Runnable runnable = new MultithreadingDemo_Runnable();
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);

t1.start();
t2.start();
}

}

1
2
3
4
5
6
7
8
9
10
Thread-1-->0
Thread-1-->1
Thread-0-->0
Thread-1-->2
Thread-0-->1
Thread-0-->2
Thread-0-->3
Thread-0-->4
Thread-1-->3
Thread-1-->4

通过上面的代码可以发现,他们不同的线程是在同时运行,在抢夺资源进行输出。谁先抢到cpu,就谁能够打印i。
从以上两份不同的代码中可以发现,其实多线程以下的特点:
1.多线程运行的代码是同样的代码
2.多线程中的一方抢到cpu,另一方就必须等待。但是这种等待并不是下一次就是你了。
3.执行的都是Run的方法
4.不是直接运行.run()方法,这是为什么呢?

以上两种实现多线程的优缺点:
Java是单继承的,所以基本都是实现实现Rnnable接口为主

说完多线程的常用实现方法,那就先简简单单谈一下,线程有哪几种状态。
直接搬运dalao的https://www.cnblogs.com/yjd_hycf_space/p/7526608.html
1.新建状态(new) : 新创建了一个线程对象
2.就绪状态(Runnable) : 线程对象创建后,其他线程调用了该线程的start()方法。该状态的线程于可运行线程池中,变得可运行,等待获取CPU的使用权。
3.运行状态(Runing) : 就绪状态的线程获取CPU,执行程序代码
4.阻塞状态(Blocked) : 阻塞状态是线程因为某种原因放弃CPU的使用权,暂停停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞状态分为三种:
(一)、等待阻塞:运行的线程执行wait方法,JVM会把该呈现放入等待池中。(wait会释放持有的锁)
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或者join()方法,或者放出了I/O请求时,JVM会把该线程设置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。(注意,sleep是不会释放持有的锁)
5.死亡状态(Dead): 线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

图:略。有空再画了

线程的优先级:
线程的优先级分别为1-10,默认的为5,权重越大,越容易抢到CPU(相对而言,即使你把他设置为10也不能一定保证它能够抢到CPU的使用权)

谢谢,爱你么么哒