JAVA线程用法详解

本文配合实例较为详细的讲解了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程序设计有所帮助。

(0)

相关推荐

  • 15个高级Java多线程面试题及回答

    Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很多令人混淆的Java线程问题.面试官只是想确信面试者有足够的Java线程与并发方面的知识,因为候选人中有很多只浮于表面.用于直接面向市场交易的高容量和低延时的电子交易系统在本质上是并发的.下面这些是我在不同时间不同地点喜欢问的Jav

  • java多线程编程之捕获子线程异常示例

    通过try catch是无法捕获子线程异常的,Thread对象提供了setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法用来获取线程中产生的异常. 复制代码 代码如下: package threads; import java.lang.Thread.UncaughtExceptionHandler; public class TextException{  public static void main(String

  • java控制线程运行

    1.线程的控制很常见,如文件传送到一半时,需要暂停文件传送,或终止文件传送,这实际上就是控制线程的运行. 2.线程有创建.可运行.运行中.阻塞.死亡5个状态. 创建:使用new运算符创建一个线程 可运行:使用start方法启动一个线程后,系统分配了资源 运行中状态:执行线程的run方法 阻塞:运行的线程因为某种原因停止继续运行 死亡状态:线程结束 3.传统方法的安全问题 Thread的stop(),suspend(),resume(),destroy()方法,因为不安全,可能造成死锁,已经不再使

  • 支持生产阻塞的Java线程池

    通常来说,生产任务的速度要大于消费的速度.一个细节问题是,队列长度,以及如何匹配生产和消费的速度. 一个典型的生产者-消费者模型如下:   在并发环境下利用J.U.C提供的Queue实现可以很方便地保证生产和消费过程中的线程安全.这里需要注意的是,Queue必须设置初始容量,防止生产者生产过快导致队列长度暴涨,最终触发OutOfMemory. 对于一般的生产快于消费的情况.当队列已满时,我们并不希望有任何任务被忽略或得不到执行,此时生产者可以等待片刻再提交任务,更好的做法是,把生产者阻塞在提交任

  • java中thread线程start和run的区别

    最近看到一个题目,代码如下: 复制代码 代码如下: public static void main(String args[]) {Thread t = new Thread() {public void run() {pong();}}; t.run();System.out.println("ping");}static void pong() {System.out.println("pong");} 问,结果会输出什么? 我运行了很多次,结果都是pong p

  • java多线程返回值使用示例(callable与futuretask)

    Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子 复制代码 代码如下: package com.future.test; import java.io.FileNotFoundException;import java.io.IOException;i

  • Java join 线程控制用法

    JDK说明: joinpublic final void join()                throws InterruptedException等待该线程终止. 抛出:InterruptedException - 如果任何线程中断了当前线程.当抛出该异常时,当前线程的中断状态 被清除测试代码: 复制代码 代码如下: public class MyThread extends Thread { public static void main(String[] args) throws

  • java多线程读写文件示例

    复制代码 代码如下: package com.ysh.file; import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; import c

  • Java多线程的用法详解

    1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( );  public Thread(Runnable target);  public Thread(String name);  public Thread(Runnable target

  • 命令行使用支持断点续传的java多线程下载器

    复制代码 代码如下: package org.load.download; import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.RandomAccessFile;import java.text.DecimalFormat; import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;impo

  • Linux中使用Shell脚本查看Java线程的CPU使用情况

    线上Java应用,在业务高峰期的时候经常出现CPU跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用CPU情况,结合jstack日志,排查到具体的线程类名. 一.首先获得jvm的进程ID: 复制代码 代码如下: ps -ef|grep javatomcat     374   372  1 11:45 ?        00:02:30 jsvc.exec -java-home /usr/java/latest -user tomcat -pidfile

随机推荐