Java开发实战1200例(I)---------------123新建无返回值的线程

本文介绍了一个Java Swing应用,演示了单线程与多线程操作StringBuilder的实例。通过两个按钮触发不同线程处理,对比了StringBuilder在并发环境下的表现,强调了其非线程安全的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package Test124;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

public class ThreadTest extends JFrame {
    private JPanel contentPane;
    private JTextArea textArea1;
    private JTextArea textArea2;
    
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                ThreadTest frame=new ThreadTest();
                frame.setVisible(true);
            }
        });
    }
    public ThreadTest(){
        setTitle("\u65B0\u5EFA\u6CA1\u6709\u8FD4\u56DE\u503C\u7684\u7EBF\u7A0B");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100,100,450,300);
        contentPane=new JPanel();
        contentPane.setBorder(new EmptyBorder(5,5,5,5));
        contentPane.setLayout(new BorderLayout(0,0));
        setContentPane(contentPane);
        
        JPanel buttonPanel=new JPanel();
        contentPane.add(buttonPanel,BorderLayout.NORTH);
        buttonPanel.setLayout(new GridLayout(1,2,5,5));
        
        JButton button1=new JButton("\u5355\u7EBF\u7A0B\u7A0B\u5E8F");
        button1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                do_button1_actionPerformed(e);
            }
        });
        button1.setFont(new Font("微软雅黑",Font.PLAIN,16));
        buttonPanel.add(button1);
        
        JButton button2=new JButton("\u591A\u7EBF\u7A0B\u7A0B\u5E8F");
        button2.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                do_button2_actionPerformed(e);
            }
        });
        button2.setFont(new Font("微软雅黑",Font.PLAIN,16));
        buttonPanel.add(button2);
        
        JPanel contentPanel=new JPanel();
        contentPane.add(contentPanel,BorderLayout.CENTER);
        contentPanel.setLayout(new GridLayout(1,2,5,5));
        
        JScrollPane scrollPane1=new JScrollPane();
        contentPanel.add(scrollPane1);
        
        textArea1=new JTextArea();
        textArea1.setFont(new Font("微软雅黑", Font.PLAIN, 16));
        scrollPane1.setViewportView(textArea1);
        
        JScrollPane scrollPane2=new JScrollPane();
        contentPanel.add(scrollPane2);
        
        textArea2 =new JTextArea();
        textArea2.setFont(new Font("微软雅黑", Font.PLAIN, 16));
        scrollPane2.setViewportView(textArea2);
        
    }
    protected void do_button1_actionPerformed(ActionEvent e){
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<5;i++){
            sb.append("《Java编程词典》\n");
        }
        for(int i=0;i<5;i++){
            sb.append("《视频学Java》\n");
        }
        textArea1.setText(sb.toString());
    }
    protected void do_button2_actionPerformed(ActionEvent e){
        final StringBuilder sb=new StringBuilder();
        for(int i=0;i<5;i++){
            new Thread(){
                public void run(){
                    sb.append("《Java编程词典》\n");
                    textArea2.setText(sb.toString());
                }
            }.start();
        }
        for(int i=0;i<5;i++){
            new Thread(){
                public void run(){
                    sb.append("《视频学Java》\n");
                    textArea2.setText(sb.toString());
                }
            }.start();
        }
    }
    
}

 

注:

String类的特性:

1) Java.lang.String使用了final修饰,不能被继承;

2) 字符串底层封装了字符数组及针对字符数组的操作方法;

3)字符串一旦创建,对象永远无法改变,但字符串引用可以重新赋值;

2 StringBuilder类简介

StringBuilder类的特性:

1) StringBuffer类的对象能够被多次的修改,并且不产生新的未使用对象。

2)StringBuilder 类在 Java 5 中被提出, StringBuilder 的方法不是线程安全的(不能同步访问)。

3)由于 StringBuilder有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则不能选用。

3 延伸:StringBuilder 和StringBuffer

作用:

1)StringBuffer也是一个关于字符串处理的类

2)StringBuffer和StringBuilder类拥有的方法基本相同,但是两者底层原来的区别如下:

3)StringBuffer是线程安全的,同步处理的,性能稍慢,如果需要线程安全的情况下要用StringBuffer。

4)StringBuilder是非线程安全的,并发处理的,性能稍快,一般建议用StringBuilder

注2:setViewportView()

setViewportView
public void setViewportView(Component view)创建一个视口(如果有必要)并设置其视图。不直接为 JScrollPane 构造方法提供视图的应用程序应使用此方法指定将显示在滚动窗格中的滚动组件子级。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值