JAVA线程用法详解

2013-12-11  来源:本站原创  分类:Java  人气:5 

这篇文章主要介绍了JAVA线程用法,配合实例针对Java中线程的开启、sleep、合并与让出等进行了较为深入的分析,需要的朋友可以参考下

本文配合实例较为详细的讲解了Java的线程技术,相信对于深入理解Java程序设计有一定的帮助。具体如下:

很多人在学习JAVA时都对线程都有一定的了解,而当我们开始接触Android开发时,才真真正正的发现了线程是多麽的重要,本文就把对Java线程的用法心得分享给大家,供大家参考。

首先,大家一定要分清线程和进程不是一回事,进程是什么呢?进程就如我们需要执行class文件,而线程才是真正调用CPU资源来运行的。一个class文件一般只有一个进程,但线程可以有很多个,线程的执行是一种异步的执行方式。

一、如何在main函数中再开启一个线程:

示例代码如下:

public class Thread_one {
  public static void main(String [] args){
    Run run = new Run();
    //run.run();//此为方法的调用,和线程有着天壤之别
    Thread thread = new Thread(run);
    thread.start();//启动线程,调用线程的run()方法
    for(int i=1; i<=20; i++){
      System.out.println("主线程i的 值:--------"+i);
    }
  }
}
class Run implements Runnable{

  @Override
  public void run() {
    for(int i=1; i<=20; i++){
      System.out.println("子线程i的 值:"+i);
    }
  }
}

二、线程中的sleep方法

示例代码如下:

public class Thread_sleep {
  /*
   * 线程停顿
   */
  public static void main(String [] args){
    Runone run = new Runone();
    Thread thread = new Thread(run);
    thread.start();
    try {
      Thread.sleep(5000);
      thread.interrupt();//中断线程的执行
      //thread.stop();//相对中断线程,stop过于粗暴,不建议使用,一般在需要强制关闭子线程时方使用此方法
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}
class Runone implements Runnable{
  @Override
  public void run() {
    for(int i=1 ; i<10; i++){
      try {
        Thread.sleep(1000);
        System.out.println("-----"+new Date()+"-----");
      } catch (InterruptedException e) {
        return ;//当捕获到子线程被中断时,直接关闭子线程
      }
    }
  }
}

在这里特别说明一点,thread.interrupt();可以中断线程的执行,相对stop温柔那么一点点,不过还不是最佳的关闭线程的方法,下面就为大家提供一种方式:

public class Thread_stop {
  public static void main(String [] args){
    Runthree run = new Runthree();
    Thread th = new Thread(run);
    th.start();
    try {
      Thread.sleep(5000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    run.setStop();
  }
}
class Runthree implements Runnable{
  boolean flag;
  @Override
  public void run() {
    flag = true;
    int i = 0;
    while(flag){
      try {
        System.out.println("子线程----"+(i++));
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
  public void setStop(){
    flag = false;
  }
}

下面就简单给大家介绍一下线程中的合并和让出:

一、如何合并线程,此处调用了join()方法

示例代码如下:

public class Thread_join {
  /*
   * 合并线程
   */
  public static void main(String [] args){
    Runtwo run = new Runtwo();
    Thread thread = new Thread(run);
    thread.start();
    try {
      thread.join();//合并线程,此时相当于方法调用
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    for(int i=0; i<10; i++){
      System.out.println("主线程:"+i);
    }
  }
}
class Runtwo implements Runnable{

  @Override
  public void run() {
    for(int i=0; i<10; i++){
      System.out.println("子线程:----"+i);
    }
  }
}

二、如何让出线程,此处调用了Thread的yield()方法,如下所示:

public class Thread_yield {

  /**让出CPU
   * @param args
   */
  public static void main(String[] args) {
    Th th = new Th("aaa");
    th.start();
    for(int i = 0 ; i<=10; i++){
      System.out.println("主线程----"+i);
    }
  }
}
class Th extends Thread{
  Th(){}
  Th(String s){super(s);}

  @Override
  public void run() {
    for(int i = 0; i<=10; i++){
      if(i%3!=0){
        System.out.println("子线程"+i);
      }else{
        System.out.println("子线程i="+i+" 线程进行切换");
        yield();//从Thread继承方可使用此方法
      }
    }
  }
}

最后和大家分享一下关于线程的优先级的问题,代码如下所示:

public class Thread_priority {
  /*
   * priority设置线程的优先级
   * Thread默认的优先级为5;Thread的最大优先级为10,最小为0
   */
  public static void main(String [] args){
    T1 t1 = new T1();
    T2 t2 = new  T2();
    t1.start();
    //t1.setPriority(Thread.NORM_PRIORITY+3);//设置t1的优先级
    t2.start();
  }
}
class T1 extends Thread{

  @Override
  public void run() {
    for(int i = 0; i<50; i++){
      System.out.println("线程T1-----"+i);
    }
  }
}
class T2 extends Thread{

  @Override
  public void run() {
    for(int i = 0; i<50; i++){
      System.out.println("线程T2"+i);
    }
  }
}

相信大家通过以上代码基本已经了解JAVA中的线程机制,希望本文所述对大家深入学习Java程序设计有所帮助。

相关文章
  • JAVA线程用法详解 2013-12-11

    这篇文章主要介绍了JAVA线程用法,配合实例针对Java中线程的开启.sleep.合并与让出等进行了较为深入的分析,需要的朋友可以参考下 本文配合实例较为详细的讲解了Java的线程技术,相信对于深入理解Java程序设计有一定的帮助.具体如下: 很多人在学习JAVA时都对线程都有一定的了解,而当我们开始接触Android开发时,才真真正正的发现了线程是多麽的重要,本文就把对Java线程的用法心得分享给大家,供大家参考. 首先,大家一定要分清线程和进程不是一回事,进程是什么呢?进程就如我们需要执行c

  • Java多线程的用法详解 2014-04-03

    本篇文章介绍了,在Java中多线程的用法详解.需要的朋友参考下 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); public Thread(Runnable target); public Thread(String name);

  • Android剪贴板用法详解 2014-01-17

    这篇文章主要介绍了Android剪贴板用法详解,以实例的形式对Android中剪贴板的各类传值方法做了较为详细的讲述,需要的朋友可以参考下 本文实例详述了Android剪贴板的用法,分享给大家供大家参考.具体方法分析如下: 这里首先需要注意的一点,就是在使用Android剪贴板的时候大家只记住一点就行了,不管是安卓设备还是PC机,复制粘贴在同一时间里只能用于一个对象上,整通俗点就是:PC机上,不可能同时从C盘复制,又从D盘复制就行了,具体的看代码,很简单,直接上代码: package com.x

  • java教程之java继承示例详解 2015-02-24

    这篇文章主要介绍了java继承示例详解,需要的朋友可以参考下 什么是继承(extends)? 继承是:新定义的类是从已有的类中获取属性和方法的现象. 这个已有的类叫做父类, 从这个父类获取属性和方法的类叫做子类. ExtendsDemo1.java /*什么是继承*/ public class ExtendsDemo1 { public static void main(String[] args) { Truck t = new Truck(); t.size = 100; //不建议这么写.

  • Memcached Java Client API详解 2013-11-12

    Memcached Java Client API详解 针对Memcached官方网站提供的java_memcached-release_2.0.1版本进行阅读分析,Memcached Java客户端lib库主要提供的调用类是SockIOPool和MemCachedClient?,关键类及方法整理说明如下. SockIOPool 这个类用来创建管理客户端和服务器通讯连接池,客户端主要的工作包括数据通讯.服务器定位.hash码生成等都是由这个类完成的. public static SockIOPo

  • js replace 与replaceall实例用法详解 2013-11-18

    这篇文章介绍了js replace 与replaceall实例用法详解,有需要的朋友可以参考一下 stringObj.replace(rgExp, replaceText) 参数 stringObj 必选项.要执行该替换的 String 对象或字符串文字.该字符串不会被 replace 方法修改. rgExp 必选项.为包含正则表达式模式或可用标志的正则表达式对象.也可以是 String 对象或文字.如果 rgExp 不是正则表达式对象,它将被转换为字符串,并进行精确的查找;不要尝试将字符串转化

  • MySQL中replace into语句的用法详解 2013-12-19

    这篇文章主要介绍了MySQL中replace into语句的用法详解,本文讲解了replace into语句的多种写法,replace into语句的作用等内容,需要的朋友可以参考下 在向表中插入数据的时候,经常遇到这样的情况: 1.首先判断数据是否存在: 2.如果不存在,则插入: 3.如果存在,则更新. 在 SQL Server 中可以这样写: if not exists (select 1 from table where id = 1) insert into table(id, upda

  • C++中的extern "C"用法详解 2014-02-02

    这篇文章主要介绍了C++中的extern "C"用法详解,简单来说,extern "C"是C++声明或定义C语言符号的方法,是为了与C兼容,需要的朋友可以参考下 简单来说,extern "C"是C++声明或定义C语言符号的方法,是为了与C兼容.说来容易,要理解起来还是得费些周折,首先我们要从C++和C的区别说起. 符号 大家都知道,从代码到可执行程序需要经过编译和链接两个过程,其中编译阶段会做语法检测,代码展开,另外它还会做一件事,就是将变量转成

  • ThinkPHP模板判断输出Defined标签用法详解 2014-02-19

    这篇文章主要介绍了ThinkPHP模板判断输出Defined标签用法详解,需要的朋友可以参考下 ThinkPHP模板引擎的defined标签用于判断常量是否已经被定义. ThinkPHP的defined标签用来判断常量是否已经被定义,其功能相当于PHP中的defined()函数.defined标签用法如下: <present name="常量">要输出的内容</present> 先在模块操作(如:Index/display )里定义一个常量并输出模板: defi

  • JavaScript中window.showModalDialog()用法详解 2014-07-15

    这篇文章主要介绍了JavaScript中window.showModalDialog()用法详解,需要的朋友可以参考下 今天在项目中用到了弹出子窗口,就想到了用JavaScript实现的两种方法,一个是window.open();一个是window.showModalDialog()方法,后者是存在父子关系的一种弹出窗口,只有子窗关闭,父窗口才激活,并且可以传送参数和返回值.正好又温习一遍用法,顺便在此记录过程中遇到的问题. 基本介绍: showModalDialog() (IE 4+ 支持)

  • Mysql导入导出工具Mysqldump和Source命令用法详解 2014-10-29

    Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式(txt)的SQL文件,通过Mysql Source命令能够将SQL文件导入Mysql数据库中,下面通过Mysql导入导出SQL实例详解Mysqldump和Source命令的用法 在PHP网站开发中,时常遇到Mysql数据库备份或数据库迁移工作,这时Mysql怎么导入导出数据库中的数据就非常关键,My

  • android开发教程之自定义属性用法详解 2014-12-25

    这篇文章主要介绍了android开发中的自定义属性用法详解,需要的朋友可以参考下 最近项目中经常需要用到自定义控件,因此自定义属性也是经常要用到的,在此说明一下自定义属性的用法: 自定义属性都存在于/value/attr.xml文件中,以如下格式存在. <resource> <declare-styleable name="自定义属性名称"> <attr name="属性名称" format="属性种类"/>

  • Node.js事件循环(Event Loop)和线程池详解 2015-03-13

    这篇文章主要介绍了Node.js事件循环(Event Loop)和线程池详解,这篇文章比较浅显地探讨了有关事件循环的内部运作机制和技术细节,都是经过深思熟虑的,需要的朋友可以参考下 Node的"事件循环"(Event Loop)是它能够处理大并发.高吞吐量的核心.这是最神奇的地方,据此Node.js基本上可以理解成"单线程",同时还允许在后台处理任意的操作.这篇文章将阐明事件循环是如何工作的,你也可以感受到它的神奇. 事件驱动编程 理解事件循环,首先要理解事件驱动编

  • oracle中lpad函数的用法详解 2015-03-20

    oracle中lpad函数的用法详解,有需求的朋友可以参考下 oracle中lpad的用法 pad翻译:填充 lpad函数,在字符串的左侧添加指定字符串,用法: www.jb51.net lpad(String ,截取长度,添加的字符串). 说是添加字符串也不准确,比较准确的说法是对String进行截取字符串, 如果截取长度大于String的长度,则在 String的左侧添加字符串进行填补,如果第三个参数未指定,则用空格进行填补. 例如: select lpad('test',10) from

  • PHP的switch判断语句的"高级"用法详解 2015-03-25

    这篇文章主要介绍了PHP的switch判断语句的"高级"用法详解,其实本文讲解的还是它的基础用法,需要的朋友可以参考下 只所以称为"高级"用法,是因为我连switch的最基础的用法都还没有掌握,so,接下来讲的其实还是它的基础用法! switch 语句和具有同样表达式的一系列的 IF 语句相似.很多场合下需要把同一个变量(或表达式)与很多不同的值比较,并根据它等于哪个值来执行不同的代码.这正是 switch 语句的用途. 注意: 注意和其它语言不同,continue

  • python模块:win32com用法详解 2012-06-28

    python模块:win32com用法详解 使用技巧 import win32com from win32com.client import Dispatch, constants w = win32com.client.Dispatch('Word.Application') # 或者使用下面的方法,使用启动独立的进程: # w = win32com.client.DispatchEx('Word.Application') # 后台运行,不显示,不警告 w.Visible = 0 w.Dis

  • getElementByID getElementsByName getElementsByTagName用法详解 2013-03-06

    HTML DOM(document object model) 当网页被加载时,浏览器会创建页面的文档对象模型.HTML DOM 模型被构造为对象的树 getElementByID getElementsByName getElementsByTagName用法详解 知识需要温故而知新,看过的也会忘记,需要巩固 WEB标准下可以通过getElementById(), getElementsByName(), and getElementsByTagName()访问DOCUMENT中的任一个标签:

  • Java NIO API详解 2013-03-14

    转自: Java NIO API详解

  • STL list链表的用法详解 2014-04-10

    ------------------------------------------------------------------------------- 原来... STL list链表的用法详解 本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通函数,而且例子丰富,通俗易懂.不失为STL的入门文章,新手不容错过! 0 前言 1 定义一个list 2 使用list的成员函数push_back和push_front插入一个元素到list中 3 list的成员函数emp

  • python处理word文件:win32com用法详解 2014-07-21

    目标:用python处理doc文件 方法:引入win32com模块 ************************************************************************** 一.安装 ************************************************************************** 首先要先下载安装win32com模块(起先在linux下装不成功,后在windows下面成功了...) 下载地址:http