哈!抓住你了
别走啦啦啦啦啦啦~
由于CPU核心数有限,即打工仔有限
线程太多,打工仔们也分身乏术~
一些线程等不及了,就要挤掉一些线程~
也就是说,线程之间的并发,并不满足肉眼“同时”~
“多开一个进程”,核心数没变
这样很容易导致一个线程异常了,整个进程也就狗带了~
举个栗子:
《一群人吃猪扒》,一张大桌子有100份猪扒(进程),人数高达1000个,每个人要吃若干量猪扒(线程),如果有一个人一直吃不到,直接干架了,把桌子给掀了,“得了,都别吃了”
进程包含线程
进程有自己独立的内存空间和文字描述符表
进程是操作系统分配内存的基本单位
线程是操作系统调度执行的基本单位
我这边提供五种语法,即描述一个线程的方式,以及启动一个线程的方式~
class MyThread extends Thread {
@Override
public void run() {
while (true) {
System.out.println("好耶 ^v^");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test1 {
public static void main1(String[] args) throws InterruptedException {
int x = 1;
Thread t = new MyThread();
t.start();
while(true) {
System.out.println("不好耶 T.T");
Thread.sleep(100);
}
}
}
main方法是一个线程
自己建立的线程也是一个线程
两个线程并发执行
为了体现并发性,我写了两个死循环
补充知识:sleep方法,即休眠,让线程进入阻塞态~
* 该状态下,线程无法进行执行
* 输入一个long类型值(单位ms),表示休眠时间~
* 这个类是Thread系统类的一个静态方法,直接通过类名进行引用
* 这个方法附带一个“编译时异常”,InterruptedException
,这个异常在这里不做赘述,但是在后面很重要,现在浅浅认为它就是个异常而已~
run方法是线程运行,被核心调度的一个方法
start方法是启动一个线程,让Java自己去调用run,自己完成并发
不难看出,run方法一旦被调用,就只会让run方法执行完,即该线程执行完,才能轮到下一个语句,其他线程全部都处于阻塞态~
而start方法则是让CPU的核心调度线程的时候再自动调用run方法,完成并发编程~
点击两个线程~
public class Test2 {
public static void main1(String[] args) throws InterruptedException {
Thread t = new Thread(){
@Override
public void run() {
while(true) {
System.out.println("好耶 ^v^");
try {
Thread.sleep(100);
} catch (InterruptedException e) {//sleep抛出中断异常,我们要让jvm去安抚它~
e.printStackTrace();
}
}
}
};
t.start();
while(true) {
System.out.println("不要耶~~~");
Thread.sleep(100);
}
}
}
不做过多阐述,就是用匿名内部类对类进行重写的基本操作~
本质上跟上面那个方法完全一样
只不过我不需要专门写一个类去继承,系统不需要加载多一个类
测试:(按ctrl + F2结束程序)
class Goble implements Runnable{
@Override
public void run() {
while(true) {
System.out.println("好耶 ^v^");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test3 {
public static void main1(String[] args) {
Thread t = new Thread(new Goble()); //传一个工具过去
t.start();
while(true) {
System.out.println("不好耶T.T");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
不做赘述~
public class Test4 {
public static void main1(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
System.out.println("好耶^v^");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.start();
while(true) {
System.out.println("不好耶T.T");
Thread.sleep(100);
}
}
}
public class Test5 {
public static void main1(String[] args){
Thread t = new Thread(() -> {
while(true) {
System.out.println("好耶^v^");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
});
t.start();
try {
System.out.println("不好耶T.T");
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
}
lambda表达式知识点所在博客:JAVA数据结构 & Java语法完善补充_java数据结构语法_s:103的博客-CSDN博客
属性 | 封装方法 |
---|---|
ID线程编号 | getId() |
名称 | getName() |
状态 | getState() |
优先级 | getPriority() |
是否为后台线程 | isDaeMon() |
是否存活 | isAlive() |
是否被中断 | isInterrupted() |
如果一个线程引用对应的线程未执行或者已经执行完毕,那么在jconsole里也不会有这个线程,那么这个引用调用isAlive,就显示false或者,执行中都是true~
Thread.currentThread()
调用这个Thread的静态方法(一样会抛异常,但是我们已经解决了)测试:
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
System.out.println("好耶 ^ v ^");
});
t.start();
Thread.sleep(1000);
System.out.println(t.isAlive());
}
public class Test5 {
public static boolean flag;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
while(!flag) {
System.out.println("好耶^v^");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
Thread.sleep(3000);
flag = true;
System.out.println("不好耶T.T");
}
}
Thread.currentThread()
//获取当前线程的引用
isInterrupted()
//判断线程引用内置的标识符是真是假
//----反应是否可以被中断
interrupt()
//线程引用变量的标识符进行取非
public static void main1(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
while(!Thread.currentThread().isInterrupted()) {
System.out.println("好耶^v^");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
Thread.sleep(3000);
t1.interrupt();
System.out.println("不好耶T.T");
}
貌似main线程已经结束了,但是t1线程似乎还没有中断~
原因就是:
解决:在捕获到异常后,直接break~
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
while(!Thread.currentThread().isInterrupted()) {
System.out.println("好耶^v^");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
});
t1.start();
t1.join(5000);
//在这里不带参数,那该t1线程就死循环了,无法结束的~
Thread.sleep(3000);
t1.interrupt();
System.out.println("不好耶T.T");
}
没有测试案例
NEW 线程还没被创建出来,只是存在这个线程对象~
TERMINATED 系统中的线程已经执行完毕~
RUNNABLE 就绪状态
TIMED_WAITING
BLOCKED
WAITING
文章到此结束!谢谢观看 !
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭!后续会有几篇关联博客,线程安全问题…
敬请期待吧~