很久没写教程了,捡起笔杆,一切重来;
来做个简单测试:
实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。
继承Thread版
class Hello extends Thread{
private String name;
Hello(String name){
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(name+" ___打个招呼,次序:"+i);
}
}
}
测试类:
public class ThreadTest {
public static void main(String[] args) {
Hello temp = new Hello("大神");
Hello temp2 = new Hello("bruce");
temp.start();
temp2.start();
}
}
结果显示 :
注意:方法执行调用start() ,调用run()是错误的,没有效果的; (虽然调用的是start()方法,但是实际上调用的还是run()方法的主体)。
实现runable接口版
class RunableHello implements Runnable{
private String name;
RunableHello(String name){
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(name+" ___打个招呼,次序:"+i);
}
}
}
class TheadPool{
public static void runMethod(Runnable temp){
Thread thread=new Thread(temp);
thread.start();
}
}
测试类:
public class ThreadTest {
public static void main(String[] args) {
RunableHello temp = new RunableHello("大神");
RunableHello temp2 = new RunableHello("bruce");
TheadPool.runMethod(temp);
TheadPool.runMethod(temp2);
}
}
结果显示:
那么区别在哪呢?
Thread和Runnable的区别:
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。(实验证明,结果并不成立,没区别,可能数据量太小,也不知道谁出的这个结论,有疑问的,欢迎留言)
这里用网络售票系统做演示,比如我们有N多个窗口买票,单票数有限, 代码如下:
网络售票系统测试
继承版Thread窗口类:
class OrderWindows extends Thread{
private int order = 10;
private String name;
OrderWindows(String name){
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
if(order>0){
System.out.println(name+"售票"+order+"成功;");
// 每次成功递减
order--;
}
}
}
}
测试类:
public static void main(String[] args) {
OrderWindows orderWindows = new OrderWindows("窗口小华");
OrderWindows orderWindows2 = new OrderWindows("窗口小丽");
OrderWindows orderWindows3 = new OrderWindows("窗口小吴");
orderWindows.start();
orderWindows2.start();
orderWindows3.start();
}
运行结果:
显示: 每个窗口都去循环了10次,并把重复的票买了出去,无法做到线程内数据共享;
接口版Runable窗口类:
class RunableOrderWindows implements Runnable{
private int order = 10;
@Override
public void run() {
for (int i = 0; i < 20; i++) {
if(order>0){
System.out.println(Thread.currentThread().getName()+"售票"+order+"成功;");
// 每次成功递减
order--;
}
}
}
}
测试代码
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
RunableOrderWindows orderWindows = new RunableOrderWindows();
new Thread(orderWindows, "丽丽").start();
new Thread(orderWindows, "小华").start();
new Thread(orderWindows, "介音").start();
}
}
结果显示
结果显示,还是会出现2个窗口同时卖出一样的票,结果好像没啥区别;
可怕,欢迎有提问,提问,搞不懂啊;