启动多线程的3种方式
继承Thread类、实现Runnable接口、匿名类
- 继承Thread类
- 在run方法中实现主逻辑(run对于子线程就好比主方法),其它部分跟正常的类一样
- 在主方法中,通过上一步的类实例化的对象调用start()方法,开启子线程
- 实现Runnable接口
- 接口中定义了run方法,实现它,同1中的实现类的逻辑是一样的
- 因为是实现的接口,并没有开启子线程的start()方法,1中有start()方法是因为它继承的是Thread类,而我们这里是实现的Runnable接口,于是我们需要把实现类的实例化对象当作参数传给Thread类的构造函数,得到一个Thread的对象,再调用start()方法开启子线程
- 简述一下:1. 实现Runnable接口,设实现类为A 2. new Thread(A).start()开启子线程
- 匿名类
使用匿名类快速继承Thread或者实现Runnable
- 匿名类没有构造函数,所以如果有需要输入的参数需要在类外定义好,并用final进行修饰(1.7以后不强制加final,但编译过程中会自动转,但最好还是
常见线程方法
sleep join yield setPriority setDaemon
sleep:当前线程暂停,注意,它是Thread类的静态方法,所有类和类对象共享,其实就相当于暂停
join:执行当前代码的线程等待调用join方法的线程结束返回后再继续执行,应用场景:等待子线程结束
setPriority:设置线程优先级
线程同步synchronized用法
- 可以把synchronized想象成一个针对于某个具体对象的令牌,同一时间只允许一个线程持有它,持有它的线程可以独占任何被synchronized修饰的方法或代码块,此时别的进程不能访问synchronized修饰的方法或代码块。
使用方式:
- 作为修饰符修饰方法:调用方法时获得“令牌”,令牌的对象为调用当前方法的对象,调用结束扔掉“令牌”
- 作为代码块:执行代码块时获得令牌,代码块结束后返还“令牌”,令牌的对象是传入的参数
线程安全
类的所有方法都被synchronized修饰











网友评论