java多线程的总结

目录

一、线程的休眠(毫秒为单位)

二、线程的加入

三、线程的中断

四、线程的礼让 

 五、线程的优先级

 六、线程的同步机


一、线程的休眠(毫秒为单位)

Thread.sleep(100)

二、线程的加入

如果当线程为多线程程序,假如存在一个线程A ,现在需要加入一个线程B,并要求线程B先执行完毕,在执行A程序,此时可以用Thread中的join()方法来完成。举个例子就好像你正在吃饭,有个人给你打电话,你扔下筷子去接电话,然后打完电话继续回来吃饭。

 class t implements Runnable
{
    public void run()//run方法覆写
    {
        for(int i=0;i<5;i++)//下面这段代码执行5次
        {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }//休眠一秒
            System.out.println(Thread.currentThread().getName()+"-->"+i);//获取当前线程名字
        }
    }
}
public class join{
    public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(new t());
        t1.setName("t1");//重命名
        t1.start();//启动线程
        for(int i=0;i<10;i++)
        {
            System.out.println(Thread.currentThread().getName()+"-->"+i);
            if(i==4)
            t1.join();//当i=4的时候主线程进入就绪状态,t1线程进入执行状态
        }
    }
}

三、线程的中断

方法一 、 stop()来结束线程

方法二、 run()方法中使用无线循环的形式,然后使用布尔型标记控制循环的停止

private boolean creat =false;
public void run(){
   while(true){
       if(creat)
          break;
   }
}

方法三、使用Thread类中的interrupt()方法使线程远离run()方法,同时结束线程 

 Thread.interrupted();

Thread.interrupt();

区别1,interrupted()属于类方法,而interrupt()和isInterrupted()属于对象方法。
区别2:
interrupted():返回当前线程的中断标志位,并设置中断标志位false;
interrupt():设置线程对象的中断标志位为true;
isInterrupted():返回线程对象的中断标志位。
关于,当线程满足两个条件,阻塞状态和中断标志为ture,则会抛出InterruptedException异常,并且会自动将中断标志位设置为false,阻塞方法,一般有,Thread.sleep(…),Object.wait(…),join(…),中断不会停止线程。

四、线程的礼让 

礼让线程,让正执行的线程停止,但不阻塞

将线程从运行状态转为就绪状态

让cpu重新调度,礼让不一定成功,看cpu心情

public class TestYield {

    public static void main(String[] args) {
        MyYield myYield = new MyYield();

        new Thread(myYield,"a").start();
        new Thread(myYield,"b").start();
    }

}

class MyYield implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程开始执行!");
        Thread.yield();//礼让
        System.out.println(Thread.currentThread().getName()+"线程停止执行!");
    }
}

 五、线程的优先级

线程优先级的定义方法

ThreadA.setPriority(10)//优先级的定义可以定义在1~10; 

setPriority("ThreadA",5,ThreadA);

 六、线程的同步机制

1、同步块

如果不设置sychronized关键字的时候,多线程无法自己判断如何结束,即当num>0的时候会一直执行各个线程,我们需要设定资源冲突问题的解决办法,当设置sychronized关键字的时候,就会给共享资源上一道锁,允许一个线程进去

package ThreadDemo1;
//线程安全
public class ThreadSafeTest implements Runnable {
    int num = 10;
    public void run() {
        while(true) {
            synchronized ("") {
                if (num > 0) {
                /*添加异常快捷键
                * 1.有的时候idea捕获异常的快捷键Alt+Enter不会弹出提示,
                 2.使用Ctrl+Alt+T,会弹出try catch异常提示*/
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("tickets" + num--);
                }
            }
        }
    }
    public static void main(String[] args) throws InterruptedException{
        ThreadSafeTest t = new ThreadSafeTest();
        Thread A = new Thread(t);
        Thread B = new Thread(t);
        Thread C = new Thread(t);
        Thread D = new Thread(t);
        A.start();
        B.start();
        C.start();
        D.start();

    }
}

2、同步方法

public synchronized void f(){   }

当对象调用同步方法的时候必须先执行完其他的同步方法才能被执行(必须将每个能访问的共享资源都定义为synchronized类型

 

 

 

 

posted @ 2022-07-31 17:11  鹅城小铁匠  阅读(55)  评论(0)    收藏  举报
Fork me on GitHub