打字猫

Java多线程01

多线程

1. 进程与线程

1.1 进程

​ 操作系统中最小的单位,通过进程可以创建程序的应用。

1.2 线程

​ 线程是进程中最小单位,一个进程中可以包含多个多线程,并且可以同时执行,此时就形成了多线程状态。

1.3 并发与并行

​ ​ ​ ​ ​并发是两个队列**交替**使用一台咖啡机,并行是两个队列**同时**使用两台咖啡机,如果穿行,一个队列使用一台咖啡机,那么哪怕前面那个人去厕所呆了一天,后面的人也只能死等着他回来才能去接咖啡,这样的效率是最低的。

​ 并发:是指两个队列交替的在一台咖啡机上接咖啡

​ 并行:是指两个队列在两台咖啡机排队接咖啡

​ 串行:只有一个队列,排队一个个接咖啡

2. 自定义线程实现方式

2.1 继承Thread类

public Numshuffle extends Thread {
    //重写run方法
    public void run() {
        
    }
}

main 
    Numshuffle numshuffle = new Numshuffle();
	//启动线程
	numshuffle.start();
  • 优点:继承方式,优点明显,编程方式比较简单,直接就可以进行调用。
  • 缺点:单继承,所以希望扩展时困难。

2.2 实现Runnable接口

public Numshuffle implements Runnable {
    
    //重写run方法
    public void run() {
        
    }
}

main
    Numshuffle numshuffle = new Numshuffle();
	Thread t1 = new Thread(numshuffle);
	//启动线程
	t1.start();
  • 优点:先将线程类进行实例化,再利用Thread实现线程的调用,稍显复杂。
  • 更高灵活度,可以实现继承的同时,还可以实现多接口。
  • 可以实现任务共享机制。

2.3 run方法调用和start调用的区别

​ run方法时定义再线程类中,作为自定义线程,需要重写run方法,如果直接通过main主线程调用,就和调用普通的对象方法时一样的,并不会让线程单独启动。而start方法是定义在Thread类中的,通过start方法,jvm虚拟机会自动的调用run方法,执行线程任务,所以该种方式是能够实现多线程的方式。一个线程不能够重复执行。

3. 线程调度

方法 说明
setPriority(int newPriority) 更改线程的优先级
static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠
void join( ) 等待该线程终止
static void yield( ) 暂停当前正在执行的线程对象,并执行其他线程
void interrupt( ) 中断线程
boolean isAlive( ) 测试线程是否处于活动状态

3.1 setPriority

更改线程的优先级,优先级是从1~10设置,默认是5。

Thread thread = new Thread(tr,"线程优先级高");
//设置线程的优先级
thread.setPriority(10);
System.out.println(thread.getPriority());
thread.start;

3.2 sleep

能够让当前线程进如休眠状态,通过毫秒的参数进行设定。

public class TestThreadSleep {
    public static void main(String[] args) throws InterruptedException {
        //匿名内部类启动线程
        new Thread(new Runnable()  {
            @Override
            public void run() {
                //让线程睡眠3秒钟,注意:此处的时间是按照毫秒计算的。所以1秒等于1000毫秒
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //打印当前线程的名字和id号
                Thread thread = Thread.currentThread();
                System.out.println(thread.getName() + " ==> " + thread.getId());
            }
        }).start();
        Thread.sleep(5000);//让主线程睡眠5秒
        Thread thread1 = Thread.currentThread();
        System.out.println(thread1.getName() + " ==> " + thread1.getId());
    }
}

3.3 join

让一条线程强制插入到正在运行的线程过程中,在执行后,再让出执行权。

public void sleep() {
    while(true) {
        
        //每秒睡一次
        try{
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        
        Date date = new Date();
        
        System.out.println(date);
    }
}

main:
	for (int i = 0; i < 10; i++) {
        System.out.println(Thread.currentThread().getNmae() + "=" + i);
        if(i == 5) {
            try {
                st.join();//强势性,插入执行后,其他线程全部等待
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
posted @ 2023-07-10 21:53  我还是我吗?  阅读(7)  评论(0编辑  收藏  举报