A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗玉宁 中级黑马   /  2013-4-8 09:21  /  2900 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗玉宁 于 2013-4-11 12:43 编辑

想一个线程就是执行一秒钟,一秒钟后结束。我是这么想的谁有更好的方法请告诉我。
  1. class TimerTest
  2. {
  3.         public static void main(String[] args) throws Exception
  4.         {
  5.                
  6.                 Test t = new Test();
  7.                 t.setDaemon(true);
  8.                 t.start();
  9.                 Thread.sleep(1000);
  10.         }
  11. }
  12. class Test extends Thread
  13. {
  14.         public void run()
  15.         {
  16.                 while(true)
  17.                 {
  18.                         System.out.println("xxxxx");
  19.                 }

  20.         }
  21. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
此程序的意思是,创建一个线程并设为 守护线程,这个线程和主线程同时运行,如果运行到主线程,主线程睡眠1秒,醒来后只剩下之前的那个守护线程,程序结束。是这个意思吗? 但是这样控制,时间好像不精确?如果先执行了创建的线程一会才执行主线程,这超出1秒了吧?
回复 使用道具 举报
I know 寻求更好
回复 使用道具 举报
线程池的概念与Executors类的应用
首先介绍在TCP服务器编程模型的原理,当一个客户端连接到服务器,服务器要起一个线程为之服,当客户端的回话结束时,线程也就结束了,即每一个客户端连接,服务器 就要为之创建一个新的线程,这好比假设每个报名学员都要通过我来亲自接 待,以便给每个学员一种好的感觉,但每个学员报名手续花费半个小时,对于 50名学生,我一个个接待和为之办手续,显然是不实际的,那么我会怎么做呢
?我会先接待每个学员,打完招呼后,再把他分配给一名工作人员去办理手续 ,这样我就接待了每一名学员.
         如果访问服务器的客户端很多,那么服务器要不断的创建和销毁线程, 这样将严重影响服务器的性能,如果真的来一名学员,我们就安排一名新的 工作人员为之服务,这也是不可能的,那么公司岂不是要招很多工作人员.
应该是一名工作人员服务完一名学员,空闲下来后,一旦有新的学员要服务,
我们安排该工作人员,为之服务.
        线程池的概念于此类似,首先创建一些线程,他们的集合称为线程池,
当服务器接收到一个客户请求后,就从线程池中取出一个空闲的线程为之服
务,服务完成后不关闭该线程,而是将该线程还回到线程池中.
        在线程池的编程模式下,任务是交给整个线程池,而不是直接交给某个线
程,线程池拿到任务偶,他就在内部找有空闲的线程,再把任务交给内部某个
空闲的线程,这就是封装.记住,任务是交给整个线程池,但可以同时向一个线程池中提交多个任务.
创建固定大小的线程池:
ExecutorService threadPool = Executors.newFixedThreadPool(3);
threadPool.execute(Runnable runnable);

创建缓存的线程池:
如果线程不够自动创建新的线程满足服务
ExecutorService threadPool = Executors.newCachedThreadPool();
threadPool.execute(Runnable runnable);

创建单一线程池.
线程里面只有一个线程,如果该线程意外死亡,那么系统会自动创建一个新的线程来代替.
ExecutorService threadPool = Executors.newSingleThreadExecutor();
threadPool.execute(Runnable runnable);

//执行完任务后关闭线程池,
threadPool.shutdown();
//不管任务是否完成都关闭线程池
threadPool.shutdownNow();

用线程池启动定时器.
Executors.newScheduledThreadPool(3).schedule(new Runnable(){
@Override
publicvoid run() {
}
}, 20, TimeUnit.SECONDS);

线程池的概念,看看吧,张老师7k面试有讲到,但不详细,在这里,总结分享一下

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 .....

查看全部评分

回复 使用道具 举报
本帖最后由 何衍其 于 2013-4-8 22:51 编辑

你看如下的示例代码能达到你的要求不
  1. public Object waitCallComplete() throws InterruptedException, ExecutionException, TimeoutException{
  2.    
  3.     // 新建一个线程池
  4.     ExecutorService executorService = Executors.newCachedThreadPool();
  5.    
  6.     Callable<Object> callable = new Callable<Object>(){
  7.         public Object call() throws Exception {
  8.             
  9.             // 这里可以替换为从数据库中取数据,或其它的计算
  10.             Object obj = new Object();
  11.             return obj;
  12.         }
  13.     };
  14.    
  15.     // 执行任务
  16.     Future<Object> future = executorService.submit(callable);
  17.    
  18.     // future.get方法将阻塞并等待一秒,如果一秒后没有返回,则抛出异常
  19.     Object returnObj = future.get(1, TimeUnit.SECONDS);
  20.    
  21.     return returnObj;
  22. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马