林焕
1.Thread继承类:1.自定义类继承Thread;
2.重写自定义类中run()方法;
3.创建自定义类的对象;
4.自定义类对象调用start()方法开启线程;
Runnable实现类:1.定义实现类实现Runnable;
2.重写实现类中run()方法;
3.创建实现类的对象;
4.实现类的对象作为参数创建Thread对象;
5.Thread对象调用start()方法开启线程;
2.继承Thread类体现了继承体系中的单继承性;
实现Runnable接口可以让线程实现资源共享;
实现Runnable接口优势:1.可以实现多线程资源共享;
2.避免了单继承的局限性;
3.将线程任务与线程对象进行分离,解耦,增加了程序的健壮性;
4.线程池中只能使用Runnable Callable;
3.线程安全问题的产生是指:多线程程序中多线程共享同一资源,并对资源有写的操作,产生了数据不同步现象;
解决线程安全有3种方式:1.同步方法块;
2.同步方法;
3.lock锁;
4.sleep()方法和wait()方法的区别:
sleep()方法:进入“休眠” 等待时间到了就结束,在等待时间内的状态就是计时等待状态;
wait()方法:一:wait()不传递时间参数,进入无限等待只能依靠另一个同步线程完成唤醒;
二:wait()传递时间参数,进入计时等待;如果在这段时间内另一个同步线程完成唤醒,那么就唤醒;否则那么就等到这段时间结束就醒了;
5.线程状态:1.new(新建):新建后进入runnable状态;
2.runnable(可运行):拿到锁对象后线程执行;
3.waiting(等待):等待其他线程调用notify()方法唤醒进入锁阻塞状态,否则一直处于等待状态;
4.timed waiting(时间等待):等待时间结束,进入锁阻塞状态;
或者其他线程调用notify()方法使其进入锁阻塞状态;
5.blocked(锁阻塞):线程获得锁对象后执行该线程;
6.teminated(结束): |