Java中的多线程

实现多线程的方式:

继承Thread:

1:先有一个类 继承 Thread类
2:重写 Thread 类里面 run方法, 把你要让新线程 做的任务 写在 run方法里面
3:在测试类中 创建这个类的对象
4:不是调用run方法, 而是要调用start方法, 线程就开启了。

方法:

设置线程的名字:通过Thread的构造方法,Thread类里面的setName()方法
获取线程的名字:getName()
获取当前线程Thread.currentThread()
线程的优先级getPriority()

void join();插队,优先执行


守卫线程void setDaemon(boolean b); 主线程结束,JVM关闭,守卫线程结束。

Runnable:

1:先有一个类 ,实现 Runnable 接口
2:重写 Runnable 类里面 run方法, 把你要让新线程 做的任务 写在 run方法里面
3:创建这个类的对象
4:创建Thread对象 并Runnable的子类对象 作为 Thread类的 构造方法的参数传递进去
5:让Thread的对象 调用start方法


第二种方式符合高内聚低耦合的设计思想。实现了线程与线程任务的分离。

同步:

非静态方法同步:


非静态同步代码块(不用写那个对象了,默认带this):



可以转换为非静态同步方法:

静态同步方法:


总结:

非静态的同步方法的锁对象 是this
静态的同步方法的锁对象 是 当前方法所在的类的 class 文件对象,

class Student {

    public void show(){
        synchronized(this){
            //n行代码 1
        }
    }

    public synchronized void show(){
        //n行代码 1
    }


    public static void method(){
        synchronized(Student.class){
            //n行代码 2
        }
    }

    public static synchronized void method(){
        //n行代码 2
    }
}

Lock:



线程安全的类

Map :

Hashtable : jdk1.0的时候出现的。 效率低。 就是因为他线程安全的。
Properties
HashMap 代替 Hashtable
ArrayList 代替 Vector
StringBuilder 代替 StringBuffer

Collections里面有方法可以生成一个线程安全的list,set,map。

PV操作:

实现方法——wait(),notify(),notifyAll():


它们都继承自Object,必须在同步代码块里调用,并且必须使用锁对象调用,锁对象不能是任意对象。

wait():

当前线程暂停(放弃占用CPU进入等待状态)直到另一个线程调用该对象的notify()或者notifyAll()方法。

notify():

唤醒线程队列里随机的一个线程

notifyAll():

唤醒线程队队列里全部线程

经典的单缓冲区生产者消费者问题:

奶箱类:



this.wait()的含义是:
state为true表示有奶则线程producer进入put()方法并且将producer线程停下来(this.wait()),
等待一个customer线程get()到奶并且调用notify()或者notifyAll(),把在put()方法里的producer线程唤醒,
producer就可以生产奶了。

生产者类:

消费者类:

测试类:

测试结果:

原文地址:https://www.cnblogs.com/maomaodesu/p/11923733.html