答案是否定的,因为继承Thread其实也实现Runnable,所以不存在实现Runnable可以,继承Thread就不可以的
道理。实现多线程资源共享必须使用synchronized,否则肯定会有安全问题。以下代码运行结果可以表明。
(就算不Thread.sleep(500);也一样存在安全问题)
package com.thread.test;
/**
* 网上有资料说使用Runnable实现的多线程可以达到资源共享的目的,难道继承Thread就不能达到资源共享的目的?
* 答案是否定的,因为继承Thread其实也实现Runnable,所以不存在实现Runnable可以,继承Thread就不可以的
* 道理。实现多线程资源共享必须使用synchronized,否则肯定会有安全问题。以下代码运行结果可以表明。
* (就算不Thread.sleep(500);也一样存在安全问题)
*/
public class ThreadTest {
static class MyRunnable implements Runnable {
int ticket = 5;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (ticket > 0) {
System.out.println(Thread.currentThread().getName() + " 买票:" + ticket--);
}
}
}
}
public static void main(String[] args) {
MyRunnable my = new MyRunnable();
new Thread(my, "1号线程").start();
new Thread(my, "2号线程").start();
new Thread(my, "3号线程").start();
}
}
执行结果:
2号线程 买票:5
2号线程 买票:4
2号线程 买票:3
2号线程 买票:2
2号线程 买票:1
1号线程 买票:0
8 个解决方案
#1
没看出有问题,总共买了5张票啊,不明白楼主意思
#2
各种教科书上都说java实现线程的方式有两种,继承Thread和实现Runnable接口,这句话实际上看你怎么理解,我个人更愿意理解,java实现现成的方式只有一种,那就是Thread类,直接利用Thread类或者Thread类的子类,别无他法。
之所有有时候用Runnable接口,纯粹是为了java无法多重继承,但是有时候又想省事的一种实现。
之所有有时候用Runnable接口,纯粹是为了java无法多重继承,但是有时候又想省事的一种实现。
#3
大牛,Thread 类不是已经实现了Runnable了吗,所以有人说java线程只有一种实现方式,那就是实现Runnable接口。你怎么看这个说法呢
#4
继承Thread和实现Runnable接口都可以的啊。
#5
启动线程的一切玄机都在Thread类的start方法中,所以实际上就算你实现了Runnable接口的run方法,直接调用run方法与一个其它普通类没有任何区别。一个其他的类实现Runnable接口之后,如果不借助Thread类依然无法启动线程。所以完全可以认为只有Thread类或者Thread的子类才能够启动线程。
#6
启动线程的一切玄机都在Thread类的start方法中,所以实际上就算你实现了Runnable接口的run方法,直接调用run方法与一个其它普通类没有任何区别。一个其他的类实现Runnable接口之后,如果不借助Thread类依然无法启动线程。所以完全可以认为只有Thread类或者Thread的子类才能够启动线程。
学习了
#7
你可以使用数据库锁 lock()方法
#8
#1
没看出有问题,总共买了5张票啊,不明白楼主意思
#2
各种教科书上都说java实现线程的方式有两种,继承Thread和实现Runnable接口,这句话实际上看你怎么理解,我个人更愿意理解,java实现现成的方式只有一种,那就是Thread类,直接利用Thread类或者Thread类的子类,别无他法。
之所有有时候用Runnable接口,纯粹是为了java无法多重继承,但是有时候又想省事的一种实现。
之所有有时候用Runnable接口,纯粹是为了java无法多重继承,但是有时候又想省事的一种实现。
#3
各种教科书上都说java实现线程的方式有两种,继承Thread和实现Runnable接口,这句话实际上看你怎么理解,我个人更愿意理解,java实现现成的方式只有一种,那就是Thread类,直接利用Thread类或者Thread类的子类,别无他法。
之所有有时候用Runnable接口,纯粹是为了java无法多重继承,但是有时候又想省事的一种实现。
大牛,Thread 类不是已经实现了Runnable了吗,所以有人说java线程只有一种实现方式,那就是实现Runnable接口。你怎么看这个说法呢
#4
继承Thread和实现Runnable接口都可以的啊。
#5
各种教科书上都说java实现线程的方式有两种,继承Thread和实现Runnable接口,这句话实际上看你怎么理解,我个人更愿意理解,java实现现成的方式只有一种,那就是Thread类,直接利用Thread类或者Thread类的子类,别无他法。
之所有有时候用Runnable接口,纯粹是为了java无法多重继承,但是有时候又想省事的一种实现。
大牛,Thread 类不是已经实现了Runnable了吗,所以有人说java线程只有一种实现方式,那就是实现Runnable接口。你怎么看这个说法呢
启动线程的一切玄机都在Thread类的start方法中,所以实际上就算你实现了Runnable接口的run方法,直接调用run方法与一个其它普通类没有任何区别。一个其他的类实现Runnable接口之后,如果不借助Thread类依然无法启动线程。所以完全可以认为只有Thread类或者Thread的子类才能够启动线程。
#6
启动线程的一切玄机都在Thread类的start方法中,所以实际上就算你实现了Runnable接口的run方法,直接调用run方法与一个其它普通类没有任何区别。一个其他的类实现Runnable接口之后,如果不借助Thread类依然无法启动线程。所以完全可以认为只有Thread类或者Thread的子类才能够启动线程。
学习了
#7
你可以使用数据库锁 lock()方法