java多线程之:继承Thread类
程序员文章站
2022-05-16 18:33:53
...
1、特点
没有特点,全是缺点:不能再继承别的类、多线程之间不适合共享变量资源
2、基本例子
public class Run extends Thread {
public static void test() {
Run r1 = new Run();
Run r2 = new Run();
r1.start();
r2.start();
}
private int count = 1;
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + " 运行 " + count++);//获取当前执行这段代码的线程的名字,变量自增
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
因为new了两个实例出来,所以每个线程各执行各的,变量不会共享,两个线程的执行结果是一样的。
如果只new一个实例,让他执行两次start()方法,就会报错。
3、多线程中使用synchronized(锁)
public class Run extends Thread {
public static void test() {
Run r1 = new Run();
Run r2 = new Run();
r1.start();
r2.start();
}
private int count = 1;
@Override
public void run() {
synchronized (this) {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " 运行 " + count++);//获取当前执行这段代码的线程的名字,变量自增
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
因为两个线程各执行各的,互不干扰,所以加锁不加锁结果没有区别,都是线程安全的。
4、多线程中使用原子类型AtomicInteger
public class Run extends Thread {
public static void test() {
Run r1 = new Run();
Run r2 = new Run();
r1.start();
r2.start();
}
private AtomicInteger count = new AtomicInteger(1);
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " 运行 " + count.getAndIncrement());
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
同样因为两个线程各执行各的,互不干扰,所以用原子类型和普通类型没有区别,都是线程安全的。但是两个线程是并行运行的,这是多线程的基本原则。