多线程
- 程序 : 为完成特定任务,编写的指令集 ,是静态的;
- 进程:正在执行的程序,动态过程;
- 线程:进程可细化为线程,是一个程序内部的一条执行路径。
- 若一个进程同一时间并行执行多个线程,就是支持多线程
- 线程作为调度和执行单位,每个线程拥有独立的运行栈和程序计数器,线程的切换开销小
- 一个进程中多个线程共享相同的内存地址空间 ------但多个线程操作共享的系统资源可能就会带来安全隐患
单核CPU和多核CPU的理解
-
单核CPU,其实是一种假的多线程
-
多核才能更好地发挥多线程的效率(现在的服务器都是多核的)
-
一个Java应用程序java.exe , 其实至少又是那个线程:main()主线程,gc()垃圾回收线程,异常处理线程(当然发生异常会影响主线程)
并行 与 并发
- 并行:多个CPU同时执行多个任务。
- 并发: 一个CPU(采用时间片)同时执行多个任务
单核CPU 执行多线程的效率不如单线程
但因为其用户体验更好,图形窗口,后台运行的程序等
多线程
- 1.写一个继承于Tread 类的子类
- 2.重写 run() 方法 -->将此线程执行的操作声明在run()中
- 3.创建Thread的子类的对象
- 4.同过此对象调用start()
注意点:
- 不能用run() 代替start 那样就不是多线程
- 不可以让已经start();的线程再去start(); 想让该线程再次启动,可以重新创建一个线程对象
上代码!
class MyTread extends Thread{//1
@Override
public void run() {//2
for (int i = 0; i < 100; i++) {
if(i%3 == 0){
System.out.println(Thread.currentThread().getName()+i+"**Tread**");
}
}
}
}
public class Demo01 {
public static void main(String[] args) {
MyTread t = new MyTread();//3
t.start();//4
//t.run(); 不能用run() 代替start 那样就不是多线程
// 不可以让已经start();的线程再去start();
// t.start(); 会有异常 IllegalThreadStateException
// 想让该线程再次启动,可以重新创建一个线程对象 如下:
MyTread t1 = new MyTread();
t1.start();
for (int i = 0; i < 100; i++) {
if(i%3 == 0){
System.out.println(Thread.currentThread().getName()+i+"**main**");
}
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOLo99lw-1628327296569)(C:\Users\xzwc\Pictures\代码 运行图\多线程2.png)]
部分运行图如上
创建两个分线程
(匿名子类 的写法可以让代码更简洁)
class MyThread1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if(i%2 == 0){
System.out.println(Thread.currentThread().getName()+"*******"+i+"*********");
}
}
}
}
class MyThread2 extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if(i%2 != 0){
System.out.println(Thread.currentThread().getName()+"*******"+i+"*********");
}
}
}
}
public class ThreadDemo01 {
public static void main(String[] args) {
MyThread1 t1 = new MyThread1();
MyThread2 t2 = new MyThread2();
t1.start();
t2.start();
// 为了代码精简可以用匿名子类的方式
/* new Thread(){
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if(i%3 == 0){
System.out.println(Thread.currentThread().getName()+i);//100 内被3整除的数
}
}
}
}.start();*/
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mlY9D1RR-1628327296582)(C:\Users\xzwc\Pictures\代码 运行图\屏幕截图 2021-08-07 164526.png)]
可由上面的部分运行图 看出多个线程间切换达到多线程的效果
}
}
}.start();*/
}
}
[外链图片转存中...(img-mlY9D1RR-1628327296582)]
可由上面的部分运行图 看出多个线程间切换达到多线程的效果