线程编程
来源:互联网 发布:淘宝个人信用等级查询 编辑:程序博客网 时间:2024/06/08 19:24
写一个程序,创建并启动两个线程A和B。A线程每隔500毫秒生成一个2-200000之间的随机整数N,然后判断N是否是素数,并按照“当前系统时间:N是(或不是)素数”的形式输出判断结果;B线程每隔500毫秒输出一个长度为5-10之间的随机字符串,然后按照“当前系统时间:随机字符串”的形式输出结果
import java.awt.event.*;
import java.util.Random;
import java.util.Date;
import java.text.SimpleDateFormat;
import javax.swing.Timer;
public class Test7{
public static void main(String[] args)
{
thread1 r1= new thread1();
thread2 r2= new thread2();
new Thread(r1).start();
new Thread(r2).start();
try{
Thread.currentThread().join();
}catch(Exception e){}
}
}
class thread1 implements Runnable{
public void run()
{
Listener1 lis1= new Listener1();
new Timer(500,lis1).start();
}
}
class thread2 implements Runnable{
public void run()
{
Listener2 lis2= new Listener2();
new Timer(500,lis2).start();
}
}
class Listener1 implements ActionListener{
public void actionPerformed(ActionEvent e)
{
Random r=new Random();
int n=r.nextInt(19999)+2;
SimpleDateFormat sf= new SimpleDateFormat("yyyy年MM月dd日 hh点mm分ss秒");
if(checkNum(n))
System.out.println("系统时间:"+sf.format(new Date())+" 随机数:"+n+"是素数");
else
System.out.println("系统时间:"+sf.format(new Date())+" 随机数:"+n+"不是素数");
}
boolean checkNum(int n)
{
for(int i=2;i<n;i++)
if(n%i==0)
return false;
return true;
}
}
class Listener2 implements ActionListener{
public void actionPerformed(ActionEvent e)
{
Random r=new Random();
StringBuffer s= new StringBuffer();
for(int i=r.nextInt(6)+5;i>0;i--)
s.append((char)(r.nextInt(26)+65));
SimpleDateFormat sf= new SimpleDateFormat("yyyy年MM月dd日 hh点mm分ss秒");
System.out.println("系统时间:"+sf.format(new Date())+"; 随机字符串:"+s);;
}
}
这个程序设计的几个知识点总结一下:
1 如何生成随机数 java.util.Random是一个随机数生成器,他有两个构造方法,Random(),Random(long seed),两者不同在于后者使用了种子,如果使用相同的种子创建两个Random对象,则这两个对象生成的随机数序列是相同的。所以一般不使用第二个。
2 如何判断一个数是素数,这里我用的方法比较笨,即判断速度慢,还有一种快的,从2开始,直到这个数的平方根,如果没有能整除这个数的,则这个数就是素数。
boolean checkNum(int n)
{
for(int div=2;div*div<=n;div++)
if(n%div==0)
return false;
return true;
}
3 如何创建线程 有两种方法,一种是构造一个继承Thread类的类,实现run方法,用这个类直接创建对象;或者是构造一个实现Runnable接口的类,然后用这个类的对象作为参数传给Thread类,创建对象。
4 如何实现每500毫秒就打印输出,这可以使用一个Timer的类,在javax.swing包中,它的构造方法是Timer(int delay, ActionListener listener)
,这是一个计时器,每隔delay时间就向监听器发送ActionEvent对象,这些监听器会执行actionPerformed方法。
5 关于格式化数据 , 使用SimpleDateFormat可以实现格式的转化,当然本程序可以直接使用 System.out.println(new Date()),但是为了显示符合国人的习惯,转换一下显示的格式是一个很好的增加知识面的机会。
http://blog.csdn.net/gubaohua/archive/2006/01/10/575488.aspx
我从这个网址了解了一下关于SImpleDateFormat的使用方法,当然在JDK中也可以知道,但是英文翻译过来的不容易理解。上面的程序是有助于参考学习。我又打印了下G,它代表“公元”,一般会用y,M,d,H,m,s就差不多了。
6 还有一个问题,就是Thread.currentThread().join();这一句是让main线程无法停止。为什么要加上这么一句?那是因为那两个线程很快就会结束,那两个线程中的run方法只是创建一个timer对象,然后那两个线程的任务完成,然后结束。此时如果不让主线程无限制等待,那就什么打印的都看不到。这一句就是让主线程无限制等待。才能看到timer的输出。
- 线程编程
- 线程编程
- 线程编程
- 线程编程
- 线程 编程
- 线程编程
- JAVA 线程编程 ----线程介绍
- linux 线程编程:线程创建
- linux 线程编程:线程属性
- linux 线程编程:线程终止
- 线程数据库编程
- Posix线程编程指南
- Java线程编程
- POSIX线程编程
- Posix线程编程指南
- 线程基本编程
- Posix线程编程
- windows核心编程--线程
- 让你的键盘会说话!
- document.all与document.layers
- 这是哪里哦!
- 网页不让复制资料文件的解决办法
- Indexing Service 索引服务
- 线程编程
- PHP 大文件上传进度条实现
- 用DataList分页读取数据
- xp 开机画面【欢迎使用】四个字更改方法
- XP系统贯用的5个键,提高你的工作效率
- 例解BITMAP的数据格式
- json js与php应用
- 人生有太的无奈,才会充满期待
- PHP ASP.NET等效BASE64