Java——run()方法和start()方法的区别

55 篇文章 1 订阅
53 篇文章 0 订阅

线程的run()方法是由java虚拟机直接调用的,如果我们没有启动线程(没有调用线程的start()方法)而是在应用代码中直接调用run()方法,那么这个线程的run()方法其实运行在当前线程(即run()方法的调用方所在的线程)之中,而不是运行在其自身的线程中,从而违背了创建线程的初衷;

下面是一个用来说明start()方法和run()方法的区别的实例:

public class WelcomThread extends Thread {
    //在该方法中实现线程的任务逻辑
    public void run() {
        //获取当前正在执行的线程名称
        System.out.println(Thread.currentThread().getName());
    }
}

 


public class TestDemo1 {
    public static void main(String[] args) {
        Thread welcome = new WelcomThread();  //创建线程(动态规划)
        welcome.run();  //直接调用run()方法
        System.out.println(Thread.currentThread().getName());
         Thread welcome1 = new WelcomThread();  //创建线程
         welcome1.start();  //启动线程
    }
}


运行结果:

main
main
Thread-1
--------------------- 
作者:中都 
来源:CSDN 
原文:https://blog.csdn.net/QQ2899349953/article/details/81772104 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Java的生产者消费者问题的代码实现,附带GUI界面: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; public class ProducerConsumer extends JFrame implements ActionListener { private final int BUFFER_SIZE = 5; // 缓冲区大小 private final List<Integer> buffer = new ArrayList<>(BUFFER_SIZE); // 缓冲区 private final Object lock = new Object(); // 同步锁对象 private final JLabel bufferLabel = new JLabel(); // 显示缓冲区的标签 private final JTextField producerTextField = new JTextField(8); // 生产者输入框 private final JTextField consumerTextField = new JTextField(8); // 消费者输入框 private final JButton startButton = new JButton("开始"); // 开始按钮 private final JButton stopButton = new JButton("停止"); // 停止按钮 private Producer producer; private Consumer consumer; public ProducerConsumer() { setTitle("生产者消费者问题"); setSize(400, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(3, 2, 20, 10)); panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); panel.add(new JLabel("缓冲区:")); panel.add(bufferLabel); panel.add(new JLabel("生产者:")); panel.add(producerTextField); panel.add(new JLabel("消费者:")); panel.add(consumerTextField); startButton.addActionListener(this); stopButton.addActionListener(this); stopButton.setEnabled(false); panel.add(startButton); panel.add(stopButton); setContentPane(panel); setVisible(true); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == startButton) { // 点击开始按钮时,启动生产者和消费者线程 producer = new Producer(); consumer = new Consumer(); producer.start(); consumer.start(); startButton.setEnabled(false); stopButton.setEnabled(true); } else if (e.getSource() == stopButton) { // 点击停止按钮时,停止生产者和消费者线程 producer.stopThread(); consumer.stopThread(); startButton.setEnabled(true); stopButton.setEnabled(false); } } private void updateBufferLabel() { // 更新缓冲区标签的显示 String bufferText = ""; for (Integer item : buffer) { bufferText += item + " "; } bufferLabel.setText(bufferText); } private class Producer extends Thread { private boolean stop = false; public void stopThread() { stop = true; } @Override public void run() { while (!stop) { synchronized (lock) { // 如果缓冲区已满,则等待 while (buffer.size() == BUFFER_SIZE) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 生产一个随机数,并添加到缓冲区 int item = (int) (Math.random() * 100); buffer.add(item); System.out.println("生产者生产了:" + item); updateBufferLabel(); // 唤醒一个等待的线程(可能是消费者) lock.notify(); } try { // 线程休眠一段时间,模拟生产过程 Thread.sleep((int) (Math.random() * 2000)); } catch (InterruptedException e) { e.printStackTrace(); } } } } private class Consumer extends Thread { private boolean stop = false; public void stopThread() { stop = true; } @Override public void run() { while (!stop) { synchronized (lock) { // 如果缓冲区为空,则等待 while (buffer.size() == 0) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 从缓冲区中取出一个元素,并消费它 int item = buffer.remove(buffer.size() - 1); System.out.println("消费者消费了:" + item); updateBufferLabel(); // 唤醒一个等待的线程(可能是生产者) lock.notify(); } try { // 线程休眠一段时间,模拟消费过程 Thread.sleep((int) (Math.random() * 2000)); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { new ProducerConsumer(); } } ``` 运行该程序,将会显示一个GUI界面,包括一个显示缓冲区的标签、两个输入框(分别用于生产者和消费者输入数据)、一个开始按钮和一个停止按钮。点击开始按钮,程序将启动一个生产者线程和一个消费者线程,并开始模拟生产者和消费者在缓冲区中的操作;点击停止按钮,程序将停止生产者和消费者线程,结束模拟过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值