实现多线程编程方式有两种:继承Thread类、实现Runable接口
- 区别:java是单继承的,继承Thread类后就不能再次被继承了,可以通过实现Runable之后再继承来达到多继承的目的。
- 联系:Thread 实现 Runable 接口
- 线程之间共享数据(新建使用同一个类,有可能造成线程不安全)、不共享数据(新建使用不同类)
class MyThead1 extends Thread {
private int count = 5;
public MyThead1() {
super();
}
public MyThead1(String name) {
super();
this.setName(name);
}
@Override
public void run() {
super.run();
count--;
System.out.println("由" + this.currentThread().getName() + "计算得:" + count);
}
}
public class StudyTheads线程共享数据 {
public static void main(String[] args) {
// 不共享数据
MyThead1 myTheadA = new MyThead1("A");
MyThead1 myTheadB = new MyThead1("B");
MyThead1 myTheadC = new MyThead1("C");
MyThead1 myTheadD = new MyThead1("D");
myTheadA.run();
myTheadB.run();
myTheadC.run();
myTheadD.run();
// 共享数据,使用同一个类 创建不同的线程执行
System.out.println("-------------------------------------");
MyThead1 myThead1 = new MyThead1();
Thread threadA = new Thread(myThead1, "A1");
Thread threadB = new Thread(myThead1, "B1");
Thread threadC = new Thread(myThead1, "C1");
Thread D1 = new Thread(myThead1, "D1");
Thread E1 = new Thread(myThead1, "E1");
Thread F1 = new Thread(myThead1, "F1");
threadA.start();
threadB.start();
threadC.start();
D1.start();
E1.start();
F1.start();
for (int i = 0; i <100; i++) {
Thread x = new Thread(myThead1, String.valueOf(i));
x.start();
}
}
- 共享数据同时保证线程安全(重写run方法 对run方法加锁)
class MyThead2 extends Thread {
private int count = 100;
public MyThead2() {
super();
}
public MyThead2(String name) {
super();
this.setName(name);
}
@Override
synchronized public void run() {
super.run();
count--;
System.out.println("由" + this.currentThread().getName() + "计算得:" + count);
}
}
public class studyThread线程共享数据_线程安全 {
public static void main(String[] args) {
MyThead2 myThead2 = new MyThead2();
for (int i = 0; i < 100; i++) {
Thread thread = new Thread(myThead2, String.valueOf(i));
thread.start();
}
}
}