1、重写 Thread 父类方法 后创建实例调用 start 方法
2、将创建自实现 Runable 接口后的实例 作为参数传递给 Thread 的构造方法
两个条件同时存在,那个生效?
new Thread(/* condition 1 */threadTest2) {
@Override
/* condition 2 */
public void run() {
Thread.currentThread().setName("线程3");
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ' ' + "threadTest3" + i);
}
}
}.start();
条件一: 将创建自实现 Runable 接口后的实例 作为参数传递给 Thread 的构造方法
条件二: 重写 Thread 父类方法 后创建实例调用 start 方法 (创建匿名子类的匿名对象)
相同:
最后调用的都是 Thread 的start 的方法
创建的线程对象,都是Thread类或其子类的实例。
区别:
Thread 方式 线程间不可以共享数据,除非变量加 static 变为 静态变量 (每次创建实例,会有一个新的副本)。
Runable 优点:
线程间可以共享数据
class threadTest2 implements Runnable {
private int num = 100;
@Override
public void run() {
for (int i = num; i > 0; i--) {
System.out.println(Thread.currentThread().getName() + ' ' + "threadTest2 卖票" + i);
}
System.out.println(Thread.currentThread().getName() + ' ' + "票卖完了");
}
}
threadTest2 threadTest2 = new threadTest2();
threadTest2 threadTest2_1 = new threadTest2();
threadTest2 threadTest2_2 = new threadTest2();
new Thread(/* condition 1 */threadTest2) {
}.start();
new Thread(threadTest2_1).start();
new Thread(threadTest2_2).start();
package src.ThreadH;
class RunableDemo1 implements Runnable {
private int length = 6;
public void run() {
for (int i = length; i > 0; i--) {
if (length > 0) {
System.out.println(Thread.currentThread().getName() + " 卖货 " + length--);
} else {
System.out.println(Thread.currentThread().getName() + " 卖完了 " + i);
}
}
}
}
class test_ThreadAndRunableDifference {
public static void main(String[] args) {
/* Runable 操作开始*/
RunableDemo1 demon3 = new RunableDemo1();
Thread demo3 = new Thread(demon3);
Thread demo4 = new Thread(demon3);
Thread demo5 = new Thread(demon3);
demo3.start();
demo4.start();
demo5.start();
/*Runable 操作结束*/
}
}