Java多线程基本使用(2)

Thread类用于描述线程,该类定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法,也就是说该Thread类中的run方法,用于存储线程要运行的代码

5.多线程运行状态

创建线程-运行---sleep()/wait()--冻结---notify()---唤醒

创建线程-运行---stop()—消亡

创建线程-运行---没抢到cpu执行权—临时冻结

6.获取线程对象及其名称

6.1.线程都有自己默认的名称,编号从0开始

6.2.static Thread currentThread():获取当前线程对象

6.3.getName():获取线程名称

6.4.设置线程名称:setName()或者使用构造函数

public class Test extends Thread{
   
    Test(String name){
        super(name);
    }
   
    public void run(){
        for (int x = 0; x < 60; x++) {
            System.out.println((Thread.currentThread()==this)+"..."+this.getName()+" run..."+x);
        }
    }
}

class ThreadTest{
    public static void main(String[] args) {
        Test t1=new Test("one---");
        Test t2=new Test("two+++");
        t1.start();
        t2.start();
        t1.run();
        t2.run();
        for (int x = 0; x < 60; x++) {
            System.out.println("main----"+x);
        }
    }
}

三.多线程的安全问题

1.多线程出现安全问题的原因:

1.1.当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误

1.2.解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行

1.3.java对于多线程的安全问题提供了专业的解决方式,就是同步代码块:

Synchronized(对象){需要被同步的代码},对象如同锁,持有锁的线程可以在同步中执行,没有持有锁的线程即使获取cpu执行权,也进不去,因为没有获取锁

2.同步的前提:

2.1.必须要有2个或者2个以上线程

2.2.必须是多个线程使用同一个锁

2.3.好处是解决了多线程的安全问题

2.4.弊端是多个线程需要判断锁,较消耗资源

5.同步函数

定义同步函数,在方法钱用synchronized修饰即可

/*
 * 需求:
 * 银行有一个金库,有两个储户分别存300元,每次存100元,存3次
 * 目的:该程序是否有安全问题,如果有,如何解决
 * 如何找问题:
 * 1.明确哪些代码是多线程代码
 * 2.明确共享数据
 * 3.明确多线程代码中哪些语句是操作共享数据的
 */

public class Bank {

private int sum;

Object obj = new Object();

//定义同步函数,在方法钱用synchronized修饰即可
    public synchronized void add(int n) {
        //synchronized (obj) {
            sum = sum + n;
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("sum=" + sum);
        //}

}

}

class Cus implements Runnable {
    private Bank b = new Bank();

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/bbc08f35a2d885c5787b2b5d3a620896.html