关于实现多线程资源共享

时间:2022-10-05 17:31:03
 网上有资料说使用Runnable实现的多线程可以达到资源共享的目的,难道继承Thread就不能达到资源共享的目的?
 答案是否定的,因为继承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无法多重继承,但是有时候又想省事的一种实现。

#3


引用 2 楼 rumlee 的回复:
各种教科书上都说java实现线程的方式有两种,继承Thread和实现Runnable接口,这句话实际上看你怎么理解,我个人更愿意理解,java实现现成的方式只有一种,那就是Thread类,直接利用Thread类或者Thread类的子类,别无他法。

之所有有时候用Runnable接口,纯粹是为了java无法多重继承,但是有时候又想省事的一种实现。
 
大牛,Thread 类不是已经实现了Runnable了吗,所以有人说java线程只有一种实现方式,那就是实现Runnable接口。你怎么看这个说法呢 

#4


继承Thread和实现Runnable接口都可以的啊。

#5


引用 3 楼 magi1201 的回复:
Quote: 引用 2 楼 rumlee 的回复:

各种教科书上都说java实现线程的方式有两种,继承Thread和实现Runnable接口,这句话实际上看你怎么理解,我个人更愿意理解,java实现现成的方式只有一种,那就是Thread类,直接利用Thread类或者Thread类的子类,别无他法。

之所有有时候用Runnable接口,纯粹是为了java无法多重继承,但是有时候又想省事的一种实现。
 
大牛,Thread 类不是已经实现了Runnable了吗,所以有人说java线程只有一种实现方式,那就是实现Runnable接口。你怎么看这个说法呢 


启动线程的一切玄机都在Thread类的start方法中,所以实际上就算你实现了Runnable接口的run方法,直接调用run方法与一个其它普通类没有任何区别。一个其他的类实现Runnable接口之后,如果不借助Thread类依然无法启动线程。所以完全可以认为只有Thread类或者Thread的子类才能够启动线程。

#6


引用 5 楼 rumlee 的回复:
启动线程的一切玄机都在Thread类的start方法中,所以实际上就算你实现了Runnable接口的run方法,直接调用run方法与一个其它普通类没有任何区别。一个其他的类实现Runnable接口之后,如果不借助Thread类依然无法启动线程。所以完全可以认为只有Thread类或者Thread的子类才能够启动线程。

学习了  关于实现多线程资源共享

#7


你可以使用数据库锁  lock()方法

#8


该回复于2014-03-21 08:51:53被管理员删除

#1


没看出有问题,总共买了5张票啊,不明白楼主意思

#2


各种教科书上都说java实现线程的方式有两种,继承Thread和实现Runnable接口,这句话实际上看你怎么理解,我个人更愿意理解,java实现现成的方式只有一种,那就是Thread类,直接利用Thread类或者Thread类的子类,别无他法。

之所有有时候用Runnable接口,纯粹是为了java无法多重继承,但是有时候又想省事的一种实现。

#3


引用 2 楼 rumlee 的回复:
各种教科书上都说java实现线程的方式有两种,继承Thread和实现Runnable接口,这句话实际上看你怎么理解,我个人更愿意理解,java实现现成的方式只有一种,那就是Thread类,直接利用Thread类或者Thread类的子类,别无他法。

之所有有时候用Runnable接口,纯粹是为了java无法多重继承,但是有时候又想省事的一种实现。
 
大牛,Thread 类不是已经实现了Runnable了吗,所以有人说java线程只有一种实现方式,那就是实现Runnable接口。你怎么看这个说法呢 

#4


继承Thread和实现Runnable接口都可以的啊。

#5


引用 3 楼 magi1201 的回复:
Quote: 引用 2 楼 rumlee 的回复:

各种教科书上都说java实现线程的方式有两种,继承Thread和实现Runnable接口,这句话实际上看你怎么理解,我个人更愿意理解,java实现现成的方式只有一种,那就是Thread类,直接利用Thread类或者Thread类的子类,别无他法。

之所有有时候用Runnable接口,纯粹是为了java无法多重继承,但是有时候又想省事的一种实现。
 
大牛,Thread 类不是已经实现了Runnable了吗,所以有人说java线程只有一种实现方式,那就是实现Runnable接口。你怎么看这个说法呢 


启动线程的一切玄机都在Thread类的start方法中,所以实际上就算你实现了Runnable接口的run方法,直接调用run方法与一个其它普通类没有任何区别。一个其他的类实现Runnable接口之后,如果不借助Thread类依然无法启动线程。所以完全可以认为只有Thread类或者Thread的子类才能够启动线程。

#6


引用 5 楼 rumlee 的回复:
启动线程的一切玄机都在Thread类的start方法中,所以实际上就算你实现了Runnable接口的run方法,直接调用run方法与一个其它普通类没有任何区别。一个其他的类实现Runnable接口之后,如果不借助Thread类依然无法启动线程。所以完全可以认为只有Thread类或者Thread的子类才能够启动线程。

学习了  关于实现多线程资源共享

#7


你可以使用数据库锁  lock()方法

#8


该回复于2014-03-21 08:51:53被管理员删除