这是我去年看毕老师java基础部分的视频记的笔记,菜鸟笔记,难免有不足之处,还请各位大神指出!
多线程:
创建线程的目的:开启新路径让多部分代码实现同时执行;
创建多线程2中方法之一:继承Thread类:
1,创建一个类继承Thread类,
2,覆写run()
3,创建该类对象并调用start();
多线程调用run()和start()区别:
调用run()不开启线程,仅是对象调用方法;
调用start方法开启线程,并让jvm调用run()在开启的线程中执行;
继承Thread类的原理:
Thread类描述线程事物,具备线程应该有的功能;
那为什么不直接创建Thread类的实例来调用start()开启线程?那是因为Thread类的run()不做任何事情,更是因为run()没有我们定义给线程要执行的代码(线程任务)
之前所说的主线程的任务定义在main(),而我们自定义的线程需要执行的代码(线程任务)放在覆写的run();既然Thread类已经定义了线程任务的位置,那么我们只要在位置中定义任务代码即可;
创建线程2种方法之二:
1,定义一个类实现Runnable接口;
2,覆写run();
3,创建该类的实例对象;例如Demo d=new Demo();//注意线程类只有是Thread类或者他的子类,自己定义的类不是线程类;
4,创建Thread类的实例对象,并将该类作为参数传给Thread类的实例对象:Thread t=new Thread(d);
5,开启线程:利用线程类Thread调用自己的start():t.start();
多线程中的异常:相互之间的线程是独立的,假如有主线程main和自己定义的线程Thread-0;那么main结束了就退出,此时不会影响Thread-01,同理Thread-01也不会影响main线程,即使他俩有一个发生异常;
实现Runnable接口的原理:
既然可以继承Thread类覆写它的run()再new对象调用它的start()来执行run()中的任务代码,那么为何还要使用Runnable接口来是达到多线程并发访问的目的?
这是因为开发中不能保证你定义的类没有父类从而可以去继承父类Thread(java中单继承),故要实现Runnable
为什么要把Demo的实例对象d作为参数传给new Thread(d)呢?
因为JDK源码中Thread类是这样的:
class Thread
{
private Runnable target;
Thread(Runnable target)
{
this.target=target;
}
void run()
{
if(target!=null)
target.run();
}
void start()
{
run();
}
}
多线程安全问题产生的原因:
1,多个线程操作共享数据;
2,run()中运算代码有多部分,不止一部分;
java中解决多线程问题方法:使用同步代码块
synchronized(对象)
{
//需要被同步的代码块;
}
同步好处:解决多线程安全问题;
同步弊端:降低了程序的性能;
同步的前提:
必须保证多个线程在同步中使用的是同一个锁;
解决了问题是当多线程安全问题发生时,加入同步后,问题依旧,就要通过这个同步的前提来判断同步是否写正确;
|
|