静态代理问题
Thread相当于是对线程的静态代理,为线程添加了许多便于管理的额外功能。
run()
Runnable是一个接口,包含 run()方法,该方法会将线程直接运行而不会加入等待队列。
start()
Thread是Runnable的实现类,调用其start方法会将方法加入等待队列等待CPU调度。
Runnable其实相对于一个Task,并不具有线程的概念,如果直接去调用Runnable的run,其实就是相当于直接在主线程中执行了一个函数而已,并未开启线程去执行。
资源共享问题
Thread “不适合” 做资源共享,但是也可以实现。(当以Thread方式去实现资源共享时,实际上源码内部是将thread向下转型为了Runnable,实际上内部依然是以Runnable形式去实现的资源共享。)
Runnable和Thread相比优点有:
(1)由于Java不允许多继承,因此实现了Runnable接口可以再继承其他类,但是Thread明显不可以
(2)Runnable可以实现多个相同的程序代码的线程去共享同一个资源,而Thread并不是不可以,而是相比于Runnable来说,不太适合。
(3)线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类
MyThread t1 = new MyThread();
new Thread(t1, "线程1").start();
new Thread(t1, "线程2").start();
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.start();
t2.start();

第一种方法实际是对同一个runnable对象的操作,实现了资源共享,第二种方法是对两个Thread对象的操作,故无法实现资源共享。
静态代理在Java中常用于线程管理,Thread作为Runnable的实现,负责将任务加入等待队列。Runnable接口允许多继承,适合资源共享,而直接使用Thread开启线程不涉及资源共享。线程池只接受Runnable或Callable任务,强调了Runnable在多线程编程中的重要性。两种创建线程的方式,一种通过共享Runnable实例实现资源共享,另一种则分别启动两个独立的Thread对象,无法共享资源。
2976

被折叠的 条评论
为什么被折叠?



