有了Thread,为什么还要有Runnable?

有了Thread,为什么还要有Runnable?
1、为多继承提供可能。
对于类继承,java只允许单继承模式,如果你需要设计一个类既继承业务类拥有某个业务类功能,又继承线程对象Thread类具有多线程的功能,那么Thread类就无法满足你的要求。这时候就要选择Runnable。更多的接口优于抽象类的内容可参考《Effect Java》中的第16条原则,这里不赘述。

2、实现数据的共享。
首先我们知道,Thread线程对象调用run()方法是采用回调的机制。其次,每个Thread线程对象只能调用一次start方法启用一个线程。因此,把数据放在Thread对象中,并不能被多个线程所共享。

例:

class T extends Thread {
    Object o;
    public void run() {......}
}

T t = new T();
 



实例t所包含的数据对象o只能被实例t共享,当调用t.start()时,只有启用的线程能访问这个数据,即“一个数据实例对应一个线程”。

一种改进方法是从外部传入数据

class T extends Thread {
    Object o;

    public T(Object o) {
        this.o = o;
    }

    public void run() {......}
}
 


这样我们就可以生成一个对象并传给多个Thread对象,实现多线程操作一个数据。

当然java为我们提供了Runnable接口,就很好的解决了这个问题。我们把要操作的数据封装入Runnable的实现类中,然后将Runnable实例传入多个Thread对象中,就可以实现一个对象数据在多个线程的共享了。

Class R implements Runnable {
    Object o;
 
    public void run() {......}
}

Runnable r = new R();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,我们需要了解一下多线程的概念以及如何使用ThreadRunnable实现多线程多线程是指在一个程序中同时运行多个线程,每个线程都可以独立运行,互不干扰。多线程可以提高程序的执行效率,特别是在处理大量数据或需要等待某些操作完成的情况下。 在Java中,我们可以通过继承Thread类或实现Runnable接口来创建线程。继承Thread类的方式比较简单,但是由于Java只支持单继承,所以如果我们需要继承其他类的话就无法使用这种方式。因此,我们一般采用实现Runnable接口的方式来创建线程。 下面是一个简单的多线程火车票售卖系统的实现。 1. 定义一个Ticket类,表示售票系统中的一张票。 ```java public class Ticket { private int number; // 票号 private boolean sold; // 是否已售出 public Ticket(int number) { this.number = number; this.sold = false; } public int getNumber() { return number; } public boolean isSold() { return sold; } public void setSold(boolean sold) { this.sold = sold; } } ``` 2. 定义一个TicketSeller类,表示售票员。 ```java public class TicketSeller implements Runnable { private List<Ticket> tickets; // 所有的票 private int soldCount; // 已售票数 public TicketSeller(List<Ticket> tickets) { this.tickets = tickets; this.soldCount = 0; } @Override public void run() { while (soldCount < tickets.size()) { synchronized (tickets) { for (Ticket ticket : tickets) { if (!ticket.isSold()) { ticket.setSold(true); soldCount++; System.out.println(Thread.currentThread().getName() + "售出了第" + ticket.getNumber() + "张票"); break; } } } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 3. 定义一个TrainTicketSystem类,表示火车票售卖系统。 ```java public class TrainTicketSystem extends JFrame { private List<Ticket> tickets; // 所有的票 private int ticketCount; // 票数 private JTextArea textArea; // 显示信息的文本框 public TrainTicketSystem(int ticketCount) { this.ticketCount = ticketCount; this.tickets = new ArrayList<>(ticketCount); for (int i = 1; i <= ticketCount; i++) { tickets.add(new Ticket(i)); } setTitle("火车票售卖系统"); setSize(400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); getContentPane().add(panel, BorderLayout.CENTER); panel.setLayout(new BorderLayout(0, 0)); JScrollPane scrollPane = new JScrollPane(); panel.add(scrollPane, BorderLayout.CENTER); textArea = new JTextArea(); textArea.setEditable(false); scrollPane.setViewportView(textArea); JButton btnStartSelling = new JButton("开始售票"); btnStartSelling.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { startSelling(); } }); panel.add(btnStartSelling, BorderLayout.SOUTH); } private void startSelling() { textArea.append("开始售票...\n"); TicketSeller seller1 = new TicketSeller(tickets); TicketSeller seller2 = new TicketSeller(tickets); Thread thread1 = new Thread(seller1, "售票员1"); Thread thread2 = new Thread(seller2, "售票员2"); thread1.start(); thread2.start(); } } ``` 4. 在main方法中启动火车票售卖系统。 ```java public class Main { public static void main(String[] args) { TrainTicketSystem system = new TrainTicketSystem(100); system.setVisible(true); } } ``` 在这个实现中,Ticket类表示售票系统中的一张票,包含票号和是否已售出两个属性。TicketSeller类表示售票员,实现Runnable接口,run方法中使用synchronized关键字实现了对共享数据的同步访问。TrainTicketSystem类表示火车票售卖系统,使用JFrame实现了图形界面,包含一个文本框用来显示售票信息,一个开始售票的按钮,点击按钮后会创建两个线程分别模拟两个售票员进行售票。在售票员的run方法中,使用Thread.sleep方法模拟售票的过程,每售出一张票就更新已售票数并在文本框中显示售票信息。 希望这个例子能够帮助你理解如何使用ThreadRunnable实现多线程,以及如何实现数据共享。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值