线程基础,滚动字,“尼玛炸了!!!”有BUG请大婶指出

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import sun.org.mozilla.javascript.internal.regexp.SubString;

public class WelcomeJFrame extends JFrame {
	private class RollbyJPanel extends JPanel implements ActionListener,
			Runnable {
		JTextField tw, tSleep, ts;
		int sleeptime; // 睡眠时间
		JButton btnS, btnI; // 启动按钮和中止按钮
		Thread t; // 线程

		RollbyJPanel(String str) {
			this.setLayout(new GridLayout(2, 1));
			char[] space = new char[60];
			tw = new JTextField(str + new String(space)); // 若是“Welcome”,则这个结果为“welcome
															// ”;
			this.add(tw);
			JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT));
			this.add(p);
			p.add(new JLabel("sleep"));
			this.sleeptime = (int) (Math.random() * 100); // 用随机数初始化睡眠时间
			tSleep = new JTextField("" + sleeptime, 5);
			p.add(tSleep);
			tSleep.addActionListener(this); // 监听
			t = new Thread(this);
			btnS = new JButton("开始");
			btnI = new JButton("中止");
			btnS.addActionListener(this);
			btnI.addActionListener(this);
			p.add(btnS);
			p.add(btnI);
		}

		@Override
		public void actionPerformed(ActionEvent e) { // 相应事件
			if (e.getSource() == tSleep) {
				setSleeptime(); // 设置睡眠时间
			}
			if (e.getSource() == btnS) { // 启动线程
				t = new Thread(this);
				setSleeptime();
				t.start();
				btnS.setEnabled(false); // 摁下后使开始按钮变成不可操作
				btnI.setEnabled(true); // 摁下后使中止按钮变成可操作
			}
			if (e.getSource() == btnI) {
				t.interrupt(); // 中止线程
				btnS.setEnabled(true); // 摁下后使开始按钮变成可操作
				btnI.setEnabled(false); // 摁下后使中止按钮变成不可操作
			}
		}

		private void setSleeptime() {
			try { // 一定要捕获异常
				sleeptime = Integer.parseInt(tSleep.getText()); // 从tSleep中获得睡眠时间
			} catch (NumberFormatException e1) {
				JOptionPane.showMessageDialog(this, "你妈炸了!!!"); // 弹出对话框
			}
		}

		public void run() {  //实现滚动字
			while (true) {
				String str = tw.getText();
				str = str.substring(1) + str.substring(0, 1);
				tw.setText(str);
				try {
					Thread.sleep(sleeptime);
				} catch (InterruptedException e) {
					break;
				}
			}
		}

	}

	public WelcomeJFrame(String[] str) {
		super("滚动字");
		this.setBounds(500, 100, 400, 400);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		if (str == null || str.length == 0) { // 防止输入为空
			this.getContentPane().add(new RollbyJPanel("Welcome")); // 为空,则初始显示“Welcome”
		} else {
			for (int i = 0; i < str.length; i++) {
				this.getContentPane().setLayout(new GridLayout(str.length, 2));
				this.getContentPane().add(new RollbyJPanel(str[i]));
			}
		}
		this.setVisible(true);
	}

	public static void main(String[] args) {
		String[] str = { "你妈炸了!!!", "你妈炸了??", "你妈真炸了", "你妈炸了哦" }; // 需要滚动的字
		new WelcomeJFrame(str); // new 对象
	}

}

时间: 2024-08-14 16:35:21

线程基础,滚动字,“尼玛炸了!!!”有BUG请大婶指出的相关文章

线程基础:线程池(6)——基本使用(中)

(接上文:<线程基础:线程池(5)--基本使用(上)>) 3-4.JAVA主要线程池的继承结构 我们先来总结一下上文中讨论过的内容,首先就是JAVA中ThreadPoolExecutor类的继承结构.如下图所示: ThreadPoolExecutor:这个线程池就是我们这两篇文章中介绍的重点线程池实现.程序员可以通过这个线程池中的submit()方法或者execute()方法,执行所有实现了Runnable接口或者Callable接口的任务:ThreadPoolExecutor对于这些任务的执

线程基础--线程控制

3.  线程控制 1). 线程属性 目标:可以设置 线程的 detached/join 状态,线程栈的大小和最低地址等属性. detached/join 状态的区别: 当线程处于 分离状态(detached)时,线程结束时,os立即回收资源.主线程不可以调用pthread_join获取线程退出时的返回值. 当线程处于 未分离状态(join)时,线程结束时,主线程 调用pthread_join获取线程退出时的返回值, 随后释放该线程资源. a)数据类型 pthread_attr_t b)初始化及释

第6章 线程基础

6.1 线程基础 (1)线程组成:线程内核对象+线程栈(注意:进程=进程内核对象+地址空间) ①从内核角度看,线程是一个内核对象,系统用它来存储一些关于线程的统计信息(比如运行时间等) ②从编程角度看,线程是一堆寄存器状态以及线程栈的一个结构体对象.本质上可以理解为一个函数的调用器(其中的寄存器状态用于控制CPU执行,栈用于存储局部变量和函数参数及函数的返回地址)——为什么要使用线程栈的? 线程1 线程2 备注(使用线程栈的原因分析) void func1(){ int a; int b; }

线程基础--同步机制 (1)

1.  线程基础    概念 1). 线程全称控制线程 2). 多线程的优势: a) 比进程方便,可以共享相同的内存空间及文件描述符 b) 可以用于多个任务,而这些任务如果用单进程来实现是串行,在多线程里面由于CPU的调度可以实现穿插执行 c) 用于交互程序,将用户输入输出与其他部分分开,优化性能 3). 如何知道系统是否多线程pthread(POSIX线程) a) #ifdef  _POSIX_THREADS b) sysconf(_SC_THREADS) 4). 一个线程的数据结构 线程ID

线程基础:线程(3)——JAVA中的基本线程操作(中)

(接上文<线程基础:线程(2)--JAVA中的基本线程操作(上)>) 1-4.注意synchronized关键字的使用 在前面的文章中我们主要讲解的是线程中"对象锁"的工作原理和操作方式.在讲解synchronized关键字的时候,我们还提到了synchronized关键字可以标注的位置.大家经常看到相当部分的网贴,在它们的代码示例中将synchronized关键字加载到代码的方法体上,然后告诉读者:这个操作是线程安全的.代码可能如下: /** * 这个类的class对象进

线程基础:线程池(5)——基本使用(上)

1.概述 从本文开始,我将用两篇文章的篇幅,为各位读者呈现JAVA中原生的线程池技术.第一篇文章,我将讲解JAVA原生线程池的基本使用,并由此延伸出JAVA中和线程管理相关的类结构体系,然后我们详细描述JAVA原生线程池的结构和工作方式:第二篇文章,我们将继续深入,讲解JAVA原生线程池的高级特性,包括Thread工厂.队列.拒绝原则.钩子和相关工具类. 如果您是JAVA语言的初学者,请从本篇文章看起:如果您对线程池技术已有一定的了解,那么可以只看下一篇文章:如果您是高手,请绕行:如果您对我的观

线程基础--同步机制

1. ?线程基础 ? ?概念 ?? 1). 线程全称控制线程 ?? 2). 多线程的优势: ????? a) 比进程方便,能够共享同样的内存空间及文件描写叙述符 ????? b) 能够用于多个任务,而这些任务假设用单进程来实现是串行,在多线程里面因为CPU的调度能够实现穿插运行 ????? c) 用于交互程序.将用户输入输出与其它部分分开,优化性能 ?? 3). 怎样知道系统是否多线程pthread(POSIX线程) ????? a) #ifdef? _POSIX_THREADS ????? b

线程基础知识

什么是线程: 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列" 一切进程至少都有一个执行线程 进程与线程 进程是资源竞争的基本单位 线程是程序执行的最小单位 线程共享进程数据,但也拥有自己的一部分数据 线程ID 一组寄存器 栈 errno 信号状态 优先级 fork和创建新线程的区别 当一个进程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和它自己的PID.这个新进程的运行时间是独立的,它在执行时几乎

线程基础:多任务处理(13)——Fork/Join框架(解决排序问题)

============== 接上文< 线程基础:多任务处理(12)--Fork/Join框架(基本使用)> 3. 使用Fork/Join解决实际问题 之前文章讲解Fork/Join框架的基本使用时,所举的的例子是使用Fork/Join框架完成1-1000的整数累加.这个示例如果只是演示Fork/Join框架的使用,那还行,但这种例子和实际工作中所面对的问题还有一定差距.本篇文章我们使用Fork/Join框架解决一个实际问题,就是高效排序的问题. 3-1. 使用归并算法解决排序问题 排序问题是