线程编程

来源:互联网 发布:淘宝个人信用等级查询 编辑:程序博客网 时间: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的输出。

 

  

原创粉丝点击