`
ftj20003
  • 浏览: 130466 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

多线程基础总结二--Thread

    博客分类:
  • Java
阅读更多
      对于Thread来说只想说两个方法,一个是setDaemon(false|true),另一个是join()。首先说说守护线程,这么东西是干什么用的?对于Java应用我们都知道main方法是入口,它的运行代表着主线程开始工作了,我们也知道JVM里面有垃圾回收器的存在使得我们放心让main飞奔,然而这背后的故事是垃圾回收线程作为守护着主线程的守护线程默默的付出着。。。很像那个啥啊,呵呵。令人发指的是main这个畜生背后其实有好几个守护线程默默的付出!当然如果硬是要把守护线程比做女人,非守护线程比做男人的话,那么一个男人背后可以有多个默默付出的女人。Java在设计时就默认了这个现实社会不太能实现的现实,并且强制规定如果男人不在了,这个虚拟世界就over了,看来资本主义社会下长大的孩子创造的东西骨子里是封建社会的血脉啊!扯远了,对的,JVM内部的实现是如果运行的程序只剩下守护线程的话,程序将终止运行,直接结束。所以守护线程是作为辅助线程存在的,主要的作用是提供计数等等辅助的功能。下面写个小例子说明一下:
/**
 * User: yanxuxin
 * Date: Dec 10, 2009
 * Time: 7:16:55 PM
 */
public class DaemonSample {
    public static void main(String[] args) throws Exception{
        DaemonThread t = new DaemonThread();
        t.setDaemon(true);//this is set t thread as a daemon thread.
        t.start();
        Thread.sleep(2000);
        System.out.println("main thread exit.");
    }
}

class DaemonThread extends Thread {
    @Override
    public void run() {
        for(int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("i=" + i);
        }
    }
}

这个例子的结果是main主线程睡两秒之后说再见,而子线程则是在这两秒内计计数然后跟着一起说再见。当然它很不情愿,因为它想计10秒,但是没机会。把t.setDaemonThread(true)注释掉你会看到主线程说再见了,但是子线程快快乐乐的计完数说再见。这就是守护线程的作用,一切以非守护线程为主!很痴情啊,哈哈。
      另一个就是join方法,在简单的多线程编程中,常常使用它来控制线程的执行顺序,也仅仅是一小部分的作用。它的内部实现是wait(0)直至被调用线程执行完毕,调用线程才被唤醒。还是写个小例子解释一下:
/**
 * User: yanxuxin
 * Date: Dec 11, 2009
 * Time: 6:27:04 PM
 */
public class JoinSample {
    public static void main(String[] args) throws Exception{
        Thread t = new Thread(new SubThread());
        t.start();
        t.join();
        System.out.println("The end of main thread...");
    }
}

class SubThread implements Runnable {

    public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("The end of sub thread...");
    }
}

在这个例子中,被调用join()的线程是t,而调用线程则是main所以会先打印下面的那句再打印上面的,即使t要先睡两秒,main也得等着。把t.join()注释掉,main就可以扬眉吐气了。
      很多情况下我们用不到多线程,但是不幸或者幸运的是硬件的发展,在核心频率因为晶体管密度的物理原因而很难再有突破时,CPU制造商都开始从核心的数量上做文章了。从双核到4核,6核,8核,16核,48核...这么多核心带来了编程的转变,越来越多的程序需要考虑多核多线程的优势,加上技术发展的原始推动力--商业需求,共同推进了多线程编程时代。因为并发优势而被炒作为Java终结者的Scala慢慢的抬起头来,我也简单的学习了其部分内容,在多线程的编程上的确也没Java这么多的陷阱,封装的更简洁。Java始终给人的感觉是写了很多,做的很少,这种感觉程序员或许能接受,毕竟代码量上去了,但是估计烧钱的老板会疯掉。不过看到JDK7将会大量的改进java.util.concurrent包的实用性和并发性能的提高,或许掌握Java多线程的门槛会低一点。但愿不用混搭语言解决问题,虽然都是跑在JVM上的静态语言。关于java.util.concurrent包的整理,还没想好搞透彻,暂时无话可说。
5
0
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java基础知识点总结.docx

    十二、 多线程★★★★ 39 为什么要使用多线程 39 创建线程和启动 39 线程的生命周期 44 线程管理 45 线程同步 49 线程通信 52 线程池 58 死锁 64 线程相关类 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五...

    浅谈Android中多线程切换的几种方法

    我们先回顾一下Java多线程的几个基础内容,然后再分析总结一些经典代码中对于线程切换的实现方式。 几点基础 多线程切换,大概可以切分为这样几个内容:如何开启多个线程,如何定义每个线程的任务,如何在线程之间...

    详解Python并发编程之创建多线程的几种方法

    经过总结,Python创建多线程主要有如下两种方法: 函数 类 接下来,我们就来揭开多线程的神秘面纱。 . 学会使用函数创建多线程 在Python3中,Python提供了一个内置模块 threading.Thread,可以很方便地让我们创建...

    Java多线程开发(构造函数的使用)

    本文主要总结了Java多线程开发中线程创建时多用到的创建方式(不同的构造函数)以及线程组相关的基础知识

    C#线程入门教程之单线程介绍

    多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。 个人总结 在C#中我们开启一个应用程序就是打开了一个...

    Java高级教程课件 java数据库教程 JDBC教程 2-oracle基础(1)(共48页).ppt

    【完整课程列表】 Java高级教程课件 java数据库教程 JDBC教程 1-java_IO(1)(共47页).ppt Java高级教程课件 java数据库教程 JDBC教程 1-java_...Java高级教程课件 java数据库教程 JDBC教程 8-IO&线程总结(共7页).ppt

    c# 面试必备线程基础知识点

    线程的知识太多,知识点有深有浅,往深的研究会涉及操作系统、CPU、内存,往浅了说就是一些语法。没有一定的知识积累,很难把线程的知识写得全面,当然我也没有这个能力。所以想到一个点写一个点,尽量总结一些有用...

    【RT-Thread作品秀】基于RT-Thread和阿里云的气压温度测量系统-电路方案

    RT-Thread使用情况概述(简要总结下应用中RT-Thread使用情况:内核部分、组件部分、软件包部分、内核、其他)使用了RT-Thread内核中使用线程、信号量、 邮箱、内存池等功能,在读取到传感器数据后,将气压和温度数据...

    【RT-Thread作品秀】分布式温度监控系统-电路方案

    调度器:创建多个线程来实现不同的工作。 信号量:用来同步线程。 消息队列:用来实现线程之间传递的数据。 组件部分:SPI框架, Sensor框架,SAL 套接字抽象层 SPI框架:使用 SPI 框架来驱动温度传感器,上层代码可以提高...

    python语言线程标准库threading.local解读总结

    本段源码可以学习的地方: 1. 考虑到效率问题,可以通过上下文的机制,在属性被访问的时候临时...from weakref import ref # ref用在了构造大字典元素元组的第一个位置即 (ref(Thread), 线程字典) from contextlib i

    Java高级课件 java数据库教程 JDBC教程 全套PPT课件资源集合 共12个章节.rar

    Java高级教程课件 java数据库教程 JDBC教程 1-java_IO(1)(共47页).ppt Java高级教程课件 java数据库教程 JDBC教程 1-java_IO(2)(共28页)....Java高级教程课件 java数据库教程 JDBC教程 8-IO&线程总结(共7页).ppt

    【RT-Thread作品秀】智能管家精灵-电路方案

    RT-Thread使用情况概述(简要总结下应用中RT-Thread使用情况:内核部分、组件部分、软件包部分、内核、其他)(1)内核部分:调度器,信号量,libcpu/BSP。 调度器:创建多个线程来实现不同的工作。 信号量:用来同步...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】多线程的实现方式Thread、Runnable、Callable 72 【多线程】实现Runnable接口与继承Thread类比较 73 【多线程】线程状态转换 74 【多线程】线程的调度 75 线程优先级 75 sleep 76 wait 76 yield 77 join ...

    百度地图毕业设计源码-ymdx-concurrency:义码当仙之并发编程

    一、多线程基础 示例项目:concurrency01-thread-basis 进程与线程 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以...

    JAVA基础课程讲义

    通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 终止线程的典型方法(重要!!!) 171 ...

    ruby语法基础教程

    §10.1 多线程处理 69 §10.1.1 线程创建 69 §10.1.2 线程操作 70 §10.1.3 线程和异常 71 §10.1.4 线程调度 73 §10.1.5 线程同步 73 §10.2 多进程处理 79 §10.2.1 进程创建 79 第十一章 基本I/O操作 80 §11.1...

    LeetCode判断字符串是否循环-java:Java

    (2)多线程可以用三种方式实现,继承thread类,实现runnable接口的实现类实例传入thread构造器创建thread实例, 实现callable接口的实现类实例传入future task构造器,将futuretask对象传入thread构造器,用...

    如何提高爬虫的性能?

    多线程抓取4. 多进程抓取三. 总结 一. 基础理论 1. 进程与线程 什么是进程?什么是线程? 百度百科中是这样解释的: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的...

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

Global site tag (gtag.js) - Google Analytics