创建线程的方法
继承Thread类
总结
1.子类继承Thread类具备多线程能力
2.启动线程:子类对象.start()
3.不建议使用:避免OOP(面向对象编程)单继承局限性
4.Thread中run与start调用的不同:
示例代码
public class TestThread1 extends Thread {
@Override
public void run() {
// run方法线程
for (int i = 0; i < 20; i++) {
System.out.println("in run--"+i);
}
}
public static void main(String[] args) {
// main线程——主线程
TestThread1 thread1 = new TestThread1();
thread1.start(); // start:交替进行
for (int i = 0; i < 200; i++) {
System.out.println("in mian--"+i);
}
//thread1.run(); // run: 先进行分支,分支结束后进行主线程
}
}
实现Runnable接口
总结
1.实现接口Runnable具有多线程能力
2.启动线程:传入目标对象+Thread对象.start()
3.推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
示例代码
public class TestThread2 implements Runnable {
@Override
public void run() {
// run方法线程
for (int i = 0; i < 20; i++) {
System.out.println("in run--"+i);
}
}
public static void main(String[] args) {
// main线程——主线程
TestThread2 thread2 = new TestThread2();
// 创建线程对象,通过线程对象开启我们的线程, 代理
Thread thread = new Thread(thread2);
thread.start();
for (int i = 0; i < 200; i++) {
System.out.println("in mian--"+i);
}
}
}
实现Callable接口
总结
1.实现callable接口,需要返回值类型
2.重写call方法,需要抛出异常
3.创建目标对象
4.创建执行服务
ExecutorService pool = Executors.newFixedThreadPool(taskSize); //taskSize为线程池可允许的线程数量
5.提交执行
Future f = pool.submit(c);
6.获取结果
f.get();
7.关闭服务
pool.shutdown();
其他涉及知识点:静态代理(Thread与Runnable)、守护程序
静态代理
含义
被代理类和代理类同时实现相应的一套接口,通过代理类调用重写接口的方法,实际上调用的是原始对象的同样的方法。
代码举例
人们结婚,找婚庆公司代理,婚庆公司和人们都需要完成结婚这件事情。
接口:结婚接口
interface Marry {
void marry();
}
类:结婚的人
class Person implements Marry{
private String name; //姓名
Person(String name) {
this.name = name;
}
@Override
public void marry() {
System.out.println(name+"结婚啦!");
}
}
类:婚庆公司
class WeddingCompany implements Marry{
private Person target; // 结婚对象
WeddingCompany(Person target) {
this.target = target;
}
@Override
public void marry() {
before();
target.marry();
after();
}
void before() {
System.out.println("结婚前...");
}
void after() {
System.out.println("结婚后...");
}
}
执行代码
public static void main(String[] args) {
WeddingCompany company = new WeddingCompany(new Person("小米"));
company.marry();
}
执行效果
总结
1.代理对象可以扩展很多对象做不来的事情。
2.真实对象可以专注做自己的事情。