强大的多线程和倒计时程序

来源:互联网 发布:淘宝改发货地有影响吗 编辑:程序博客网 时间:2024/06/15 18:17

        在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请搜索疯狂Java;

  多线程技术是非常实用的技术,特别是碰到有关运行多个任务的程序,就只有多线程才能满足你的要求。在以下程序中我所展示的是一个倒计时程序及利用Callable接口(不是Runnable接口)来返回一个你所要求的值,关于这方面的知识,你要多看一下API文档中的线程池类executor和callable接口。如果读者感兴趣的话以下的代码一定要认真的看,特别是我标了注释的地方,相信读者一定会有收获的,还可以把下面的代码复制下来自己去运行一下看一下结果,如果不懂的地方可以发到我的邮箱。本人很荣幸为您解答,只要我力所能及的事我一定会去帮助您!

  packagerick_demo;

  importjava.awt.*;

  importjava.awt.event.*;

  importjava.util.Calendar;

  importjava.util.concurrent.Callable;

  importjava.util.concurrent.ExecutionException;

  importjava.util.concurrent.ExecutorService;

  importjava.util.concurrent.Executors;

  importjava.util.concurrent.Future;

  importjava.util.ArrayList;

  importjavax.swing.*;

  public classTest extends JFrame {

  privatestatic final long serialVersionUID = 9195701874098282860L;

  privateString[] str=new String[10];

  String bin =new String();

  JTextFieldjf;

  JTextAreaja;

  JScrollPanejp;

  JButtonjButton1;

  privatestatic short coin=0;

  JButtonjButton2;

  Calendarnow;

  int hour;

  int hourEnd;

  int minute;

  intminutend;

  int second;

  intsecondend;

  int hourend;

  intminutePlus;

  intsecondPlus;

  Thread t;

  booleanright = true;

  publicTest() {

  setSize(300,200);

  jf = newJTextField(25);

  ja = newJTextArea(20,30);

  //ja.append("hello\n"+"world");

  jp =newJScrollPane(ja);

  jp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

  jp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

  for(inti=0;i<10;i++)

  str[i] = newString();

  jf.setText("单击按纽进行相应的操作");

  jButton1 =new JButton("显示时间剩余时间");

  jButton2 =new JButton("暂停");

  Containercontainer = getContentPane();

  container.setLayout(newFlowLayout());

  container.add(jf);

  container.add(jButton1);

  container.add(jButton2);

  container.add(jp);

  //获取系统刚开始运行的初始值

  now =Calendar.getInstance();

  hourEnd =now.get(Calendar.HOUR_OF_DAY) + 1 ;

  minutePlus =now.get(Calendar.MINUTE);

  secondPlus =now.get(Calendar.SECOND);

  t = newThread(new Runnable() {

  public voidrun() {

  while (true){

  while(right) {

  try {

  Thread.sleep(60);

  jf.setText(CalTime());

  } catch(InterruptedException e) {

  e.printStackTrace();

  }

  }

  }

  }

  });

  t.start();

  jButton1.addActionListener(newActionListener() {

  public voidactionPerformed(ActionEvent event) {

  right =true;

  }

  });

  jButton2.addActionListener(newActionListener() {

  public voidactionPerformed(ActionEvent g) {

  right =false;

  }

  });

  setVisible(true);

  }

  publicString CalTime() {

  now =Calendar.getInstance();

  hour =now.get(Calendar.HOUR_OF_DAY);

  minute =now.get(Calendar.MINUTE);

  second =now.get(Calendar.SECOND);

  if (hourEnd>= hour) {

  hourend =hourEnd - hour;

  secondend =59 - second+secondPlus;

  minutend =59 - minute+minutePlus;

  }

  return"2小时倒计时hour:" + hourend + " minute: " + minutend

  + "second: " + secondend;

  }

  publicString[] work(){ //多线程关键代码

  ExecutorServiceexec= Executors.newCachedThreadPool();

  ArrayList>results= new ArrayList>();

  for(inti=0;i<10;i++)

  results.add(exec.submit(newTaskT(i)));

  for(Futurefuck : results)

  try{

  bin =fuck.get() ;

  str[coin] =bin;

  coin++;

  }catch(InterruptedException e){

  System.exit(1);

  }catch(ExecutionException e){

  }

  exec.shutdown();

  return str;

  }

  public voidsetStr(String[] alph){

  for(inti=0;i

  ja.append(alph[i]+"\n");

  }

  publicstatic void main(String args[]) {

  Test sleep =new Test();

  sleep.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

  sleep.setStr(sleep.work());

  }

  }

  class TaskTimplements Callable{

  private intid=0;

  publicTaskT(int id){

  this.id=id;

  }

  publicString call(){

  return"TaskT "+id;

  }

  }

  疯狂Java培训的课程采用针对性培养,全面提升学员就业能力,重点加强训练职业素质。老师辛勤的讲解,让学员充分感受Java的魅力,充分激发每个学员对于编程的热爱,让学员在半年的时间内掌握8-10万的代码量,成为真正的技术高手,疯狂Java采用企业全真模拟开发训练,迅速积累项目经验。让学员迅速获得其他人需要花费两年才能获得的工作技能,无忧就业!

原创粉丝点击