(九)Java入门--多线程(7)多线程的总结与扩展


一、多线程总结

1、多线程的创建:继承Thread方法或者实现Runnable接口。
2、多线程的状态:创建、运行、冻结。临时阻塞、消亡等。
3、多线程安全问题的产生:多线程操作共享数据的代码有多条。
4、多线程安全问题的解决:同步函数或者同步代码块。
5、多线程的死锁产生原因:同步锁的嵌套。
6、线程间的通信:等待唤醒机制、多生产多消费者、Lock与Condition。

二、多线程扩展了解

1、多线程中wait和sleep区别
(1)、wait可以指定时间,也可以不指定;但是,sleep必须指定时间。
(2)、在同步中,wait之后释放执行权,释放锁;sleep释放执行权,不释放锁。
(3)、如果在同步中,三个线程都被wait了,如果又同时被notifyAll,会不会造成问题?
不会,因为同一时间只会有一个线程获得执行权,然后获得同步中的锁,去向下执行程序,其他线程只有在当前线程释放锁之后,才有可能执行。
2、线程停止方式
(1)、stop:可以停止线程,但是很不安全。
(2)、run方法结束:一般run当中一般有循环结构,只要控制住循环就可以结束任务。定义标记,让循环在一定条件下结束就ok。
(3)、强制唤醒:可以使用interrupt()方法将线程从冻结状态中恢复到运行状态中,但是会发生InterrupttedException。
(4)、守护线程:setDaemon(),也成做后台线程,只要其他所有线程结束,后台就会自动消失。
3、多线程的其他方法
(1)、join();临时加入一个线程运算时可以使用。(加入到当前线程的话,当前线程会进入冻结状态,等加入的线程执行完之后,才结束冻结状态。)
(2)、线程优先级(1-10):默认是5,10最高。
(3)、yield():暂停当前线程。
(4)、一个线程匿名内部类的小例子:

public class Test {
    public static void main(String[] args) {
        new Thread(  //接口的匿名对象传给线程当做任务
                new Runnable() {
                    public void run() {
                        System.out.println("任务");
                    }
                }
        )
        {//Thread的子类方法实现
            public void run()
            {
                System.out.println("子类");
            }
        }.start();
        // Thread(){....}      子类
        //new Thread(){....}   子类对象
    }
}

输出结果:
子类

说明:
1、输出为子类的run方法为Thread父类其子类的实现方法,所以会一定执行。
2、输出为任务的run方法为Thread父类其对象任务的调用,所以如果没有子类方才会执行。

你可能感兴趣的:(Java入门)