首先声明一点,本人对java并不熟悉,只是学习过C++,然后因为课程的安排才看了一下java的,所以对java强的类库和运行机制还不是很了解。
这个java程序是为明天的实验做的准备。具体的要求是这样的:
1、编写一个程序,其功能是运行之后,其中有一个线程可以输出 20 次你的学号,另一个线程会输出 20 次你的姓名。
2、编写一个图形界面程序,运行之后,让其中有一个线程能在界面上不断显示系统当前时间(获取时间可查询 java.util.Calendar 类,它包含了多个用于获得系统时间的函数)。另让 一个线程可以在界面上提示当前系统时间下用户该做什么工作(例如当程序判断出系统时间现在是 8:00 到 9:00,则提示用户该上课;现在是 23:00 到 8:00,则提示用户该休息)。
第一眼看上去挺简单的,但是由于不是很了解多线程,所以也花了挺多时间的弄的。下面列出的代码肯定还有很多我不懂的不足之处,欢迎大家批评指正。由于是在linux下面写的,也没装什么截图工具把运行结果截图出来,所以就只源码先。
第一个挺简单的,就是弄两个线程类,然后在有主函数的那个类(不知到正式名词是什么)里面分别实例化它们的一个对象,再分别start它们就行。源代码如下:
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class ThreadExample
{
JFrame jf=new JFrame("线程都往界面上显示内容的例子");
static JTextArea jta1,jta2;
Thread trda=new thread1(); //线程trda
Thread trdb=new thread2(); //线程trdb
public ThreadExample() //构造函数,生成图形界面
{
jf.setLayout(new FlowLayout());
jta1=new JTextArea(20,30);
jta2=new JTextArea(20,30);
jf.add(jta1); jf.add(jta2); //将2个组件添加到界面上
jf.setLocation(100, 150);
jf.setVisible(true);
jf.pack();
trda.start(); //两个线程都启动
trdb.start();
}
public static void main(String args[])
{
ThreadExample frm=new ThreadExample();
}
}
class thread1 extends Thread //线程类thread1
{
public void run()
{
for(int i=1;i<=20;++i)
ThreadExample.jta1.append(i+"、"+"xxx\n");
}
}
class thread2 extends Thread //线程类thread2
{
public void run()
{
for(int i=1;i<=20;i++)
ThreadExample.jta2.append(i+"、"+"xxx\n");
}
}
第二个花了比较长的时间,主要的时间是花在了怎么动态显示时间到文本框中,经过各种度,还是没有度到怎么弄,最后还是通过实验指导书然后再结合自己的分析把它给完成了。方法就是在每次需要显示时间时重新得到Calendar一个实例,这样才可以保证每次刷时间的时候可以得到新的时间。源码如下:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.Date;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;
public class Clock
{
JFrame jf=new JFrame("Clock");
static JTextField displayTime=new JTextField(20);
static JTextField displayTask=new JTextField(20);
static JLabel timeWords=new JLabel("Time");
static JLabel taskWords=new JLabel("Task");
static Thread trda=new thread1(); //线程trda
static Thread trdb=new thread2(); //线程trdb
static Timer time=new Timer();
public Clock() //构造函数,生成图形界面
{
jf.setLayout(null);
jf.setLocation(100, 150);
jf.setSize(300,400);
displayTime.setLocation(100,20);
displayTime.setSize(140,50);
displayTime.setEditable(false);
displayTask.setLocation(100,200);
displayTask.setSize(140,50);
displayTask.setEditable(false);
timeWords.setLocation(45,20);
timeWords.setSize(70,50);
taskWords.setLocation(45,200);
taskWords.setSize(70,50);
jf.add(timeWords);
jf.add(taskWords);
jf.add(displayTime);
jf.add(displayTask);
jf.setVisible(true);
jf.setResizable(true);
trda.start();
trdb.start();
}
public static void main(String args[])
{
Clock frm=new Clock();
}
}
class thread1 extends Thread //线程类thread1
{
static String cDate;
static Calendar cal;
public void run()
{
SimpleDateFormat date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while(true)
{
try
{
cal=Calendar.getInstance();
Thread.sleep(1000);
cDate=date.format(cal.getTime());
Clock.displayTime.setText(cDate);
//提供条件给线程二运行,这个地方主要是用于测试,可以随便改
if(cal.get(Calendar.MINUTE)==48&&cal.get(Calendar.SECOND)==0)
Clock.trdb.run();
if(cal.get(Calendar.MINUTE)==49&&cal.get(Calendar.SECOND)==0)
Clock.trdb.run();
}
catch(InterruptedException e)
{
System.out.println("异常"+e.toString());
}
}
}
}
class thread2 extends Thread //线程类thread2
{
static int m;
public void run()
{
switch(m)
{
case 0:
Clock.displayTask.setText("Nothing to do!");
m++;
break;
case 1:
Clock.displayTask.setText("Time to eat!");
m++;
break;
case 2:
Clock.displayTask.setText("Time to sleep!");
m=0;
break;
default:
Clock.displayTask.setText("Nothing to do!");
break;
}
}
}