`
lantian_123
  • 浏览: 1368516 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java Thread 部分方法及概念

    博客分类:
  • Java
 
阅读更多
这里并不打算说明什么叫线程,但是可以简单举一线程的应用场景:

 

现有一拷贝程序,当我在拷贝一个非常大的文件时,突然想终止其拷贝,一个办法就是直接把该拷贝程序的进程kill,还有一办法就是多线程机制,一个线程专用于拷贝程序,另一线程监听中途终止的指令,一旦接受到其指令,马上要求另一线程停止操作。

 

优先级:线程的初始化优先级与创建此线程的线程的优先级一样。

 

守护进程(daemon):如果创建线程是守护线程那么创建出来的线程也是守护线程。如果所有非守护线程都已经停止运行,那些守护线程将被程序杀死,程序结束运行,main线程就是典型的非守护线程。ps:只有在线程启动之前setDaemon()才能将其设置为守护线程。

 

任务:通常一个实现了Runnble接口的类就是一个任务,任务就是我们在run方法中要做的事情。任务由线程来驱动,也就是说任务最终是要靠线程去帮其完成的。

 

异常捕获:run方法中产生的异常没法直接通过try catch捕获。比如:

package com.lzjun.remotecopy;

public class ExceptionCapture {
      
       public static void main(String[] args) {
            
             try {
                  ExceptionThread thread = new ExceptionThread();
                  thread.start();
            } catch (Exception e){
                  System. out .println("catch thread exception" );
            }
      }
}

class ExceptionThread extends Thread{
      
       @Override
       public void run() {
             throw new RuntimeException( "exception...");
      }
}
 

输出结果只有:

Exception in thread "Thread-0" java.lang.RuntimeException : exception...
      at com.lzjun.remotecopy.ExceptionThread.run( RemoteCopy.java:25 )
 

要想捕获该异常只需在线程上注册一个UncaughtExceptionHandler

 
try {
			ExceptionThread thread = new ExceptionThread();
			thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

				@Override
				public void uncaughtException(Thread t, Throwable e) {
					// 异常处理
				}
			});
			thread.start();
		} catch (Exception e) {
			System.out.println("catch thread exception");
		}
 

Thread.yield():静态方法,Causes the currently executing thread object to temporarily pause and allow other threads to execute.(致使当前的执行线程对象临时暂停运行,允许其他线程执行)此说明来自于jdk中的文档 ,其实并不能做到真正的暂停,这只是虚拟机对线程调度器的一种建议:“我休息会儿,其他线程赶紧做你们重要的事去吧“

 
join():实例方法,等待该线程终止。如果在当前线程中调用t.join()方法,那么当前线程就会挂起,直到t线程执行完才恢复。 

来看一个join()的代码片段:

执行cmd命令的任务

public class ExecutorTask implements Runnable{

    @Override
    public void run() {

        Process process = null;
        try {
            process = Runtime.getRuntime().exec("cmd /c dir");
             BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
             String line="";
             while ((line = reader.readLine()) != null) {
                 System.out.println(line);
             }
            process.waitFor();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            return;
        }
    }
}
 

执行cmd任务的执行器

public final class ShellCommandExecutor{

    public void execute(String command){

        ExecutorTask task = new ExecutorTask();
        Thread executorThread = new Thread(task);
        executorThread.start();
        
        //如果此段代码注释掉,你将看不到命令执行后返回的结果
                 try {
			executorThread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
      
    }

}
 

interrupt():实例方法,调用一个线程对象的interrupt方法时,如果该线程在执行一个阻塞方法如Thread.sleep()、Object.wait()、join()方法时,那么首先就会设置线程的中断状态,接着线程将取消阻塞,与此同时抛出InterrputException异常,线程终止执行任务。另一种情况就是该线程没有执行阻塞方法时,调用interrupt()只设定线程的中断状态,程序会一致运行直至自身执行完毕,也就是说当一个线程中断另外一个线程时,被中断的线程不一定立即停止执行当前在做的事情。

 

public class TestThread {

       public static void main(String[] args) {

            Thread thread = new Thread( new TestTask());
            thread.start();
            thread.interrupt();
      }
}

class TestTask implements Runnable {

       @Override
       public void run() {

                   while (true ) {
                         //Thread.sleep(100);
                        System. out .println("h" );
                  }

      }
}

 

如上代码段:线程并不会应为线程中断而停止任务的执行,只有在线程遇到阻塞方法时才会停止任务的执行。

 

            try {
                   while (true ) {
                        Thread. sleep(100);
                        System. out .println("h" );
                  }
            } catch (InterruptedException e) {
                  e. printStackTrace();
            }

 
isInterrupted():实例方法,测试线程是否中断。


interrputed():类方法,测试当前线程是否已经中断,之后清除中断状态。

 

            Thread.currentThread ().interrupt();
            System. out .println(Thread.interrupted());
            System. out .println(Thread.interrupted());

 

打印结果就是:true /  false

 

参考:

 

http://www.ibm.com/developerworks/cn/java/j-jtp05236.html

http://stackoverflow.com/questions/12121416/use-java-execute-command-with-thread-sleep

http://hapinwater.iteye.com/blog/310558

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

1
8
分享到:
评论

相关推荐

    Java Thread Programming

    在Java中,线程可以被视为程序的执行流,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和一部分堆内存。本资料“Java Thread Programming”由Paul Hyde提供,包含了关于Java线程编程的理论知识和实践代码,...

    Java-Thread-Affinity,将Java线程绑定到给定的内核.zip

    Java线程亲和性(Thread Affinity)是一个高级并发编程概念,主要涉及到操作系统调度和硬件资源的优化。在多核处理器系统中,线程亲和性允许开发者指定某个线程应该运行在哪个特定的处理器核心上,从而提高性能、...

    Java多线程完全概念题

    以上只是Java多线程概念题的一部分,理解并熟练运用这些概念对于编写高效、稳定的并发程序至关重要。在实际开发中,还需要考虑线程安全、死锁、活锁、饥饿等问题,并合理利用线程池(ThreadPoolExecutor)优化线程...

    Java学习部分代码

    14. **Java 8及以后的新特性**:包括Lambda表达式、Stream API、Optional类、方法引用和日期时间API等,这些新特性极大地提升了Java的简洁性和效率。 通过这个"Java学习部分代码"的资源,你可以找到关于上述知识点...

    Java Thread Programming (Sams) java线程编程(含code)

    Java线程编程是Java开发中的重要组成部分,尤其在多核处理器和实时系统中,有效利用线程能够提高程序的并发性和响应速度。本资源“Java Thread Programming (Sams)”提供了详细的线程编程知识,结合了理论与实际代码...

    Java课件\thread.rar

    Java线程是多任务编程中的核心概念,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。在Java中,线程是通过`Thread`类或实现`Runnable`接口来创建和管理的。本课件"thread.rar"包含的视频教程,...

    java笔试部分试题

    Java笔试部分试题是Java开发者在求职过程中经常遇到的挑战,这些题目涵盖了广泛的Java语言特性和编程概念。以下是一些可能出现的Java笔试知识点的详细解析: 1. **基础语法**:这是Java学习的基础,包括变量、数据...

    SAMS Java Thread Programming.pdf

    作者Paul Hyde不仅是一位经验丰富的Java开发者,同时也是Sun认证的Java 2平台程序员及高级Java语言讲师。本书通过丰富的示例和深入浅出的讲解,旨在帮助读者掌握专业级别的线程管理技术,从而让Java应用程序更加高效...

    SAMS Java Thread Programming

    ### SAMS Java Thread Programming #### 一、简介与概述 《SAMS Java Thread Programming》是一本专注于Java线程编程的专业书籍,由资深Java开发者保罗·海德(Paul Hyde)撰写。该书共有510页,全面介绍了如何...

    javathread.part02.rar

    `javathread.part02.rar`这个压缩包可能包含的是关于Java线程深入理解和实践的材料,可能是代码示例、课件或教程。 Java线程的创建主要有两种方式:通过实现Runnable接口和继承Thread类。实现Runnable接口更为灵活...

    java Thread

    在Java中,线程可以被理解为程序中的一个独立的执行路径,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和一部分堆内存。下面我们将深入探讨Java Thread的相关知识点。 一、线程的创建 1. 继承Thread类:...

    javathread.part104.rar

    `javathread.part104.rar`可能是一个关于Java线程深入讲解的压缩包,其中可能包含了系列教程的第104部分。在这个部分,我们可以预见到会涵盖以下几个关键知识点: 1. **线程的基本概念**:线程是程序执行的最小单位...

    javathread.part05.rar

    `javathread.part05.rar`这个压缩包很可能包含了一组关于Java线程进阶教程或实例代码,这部分内容可能涵盖了Java线程的高级特性和实战应用。 Java线程允许程序同时执行多个任务,提高了程序的并发性。在Java中,...

    java thread 3nd

    《Java Threads, Third Edition》一书深入浅出地讲解了Java线程的各个方面,从基本概念到高级主题,旨在帮助开发者掌握多线程编程的核心技能,提高软件系统的并发能力和响应速度。无论是初学者还是有经验的程序员,...

    java 的main方法

    总之,Java的`main`方法是程序的入口,而多线程编程是Java的重要组成部分,通过合理使用多线程,可以提升程序的性能和响应能力。理解线程对象与线程的概念,以及如何创建和控制线程,对于编写复杂的Java应用程序至关...

    JavaThread编程基础.pdf

    Java线程编程是Java开发中的重要组成部分,尤其在构建高性能和高并发的应用时不可或缺。本文主要探讨了Java中线程的基础知识,包括线程的类结构、生命周期、并发执行以及线程调度。 首先,Java中的线程是通过`java....

    java-multi-thread-mechanism.rar_java thread ppt

    Java多线程机制是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在本PPT文档中,我们将深入探讨Java中的线程原理、创建与管理线程的方法,以及如何处理线程间的通信和...

    Java线程的简单例子

    Java提供了两种主要的线程创建方法:通过实现Runnable接口和继承Thread类。当一个类实现Runnable接口时,只需要重写run()方法,然后通过Thread类的构造函数传入Runnable实例来创建线程。另一种方式是直接继承Thread...

    Concurrent Programming in Java Thread

    本文将详细介绍Java线程的概念、优势以及如何在实际项目中运用Java线程。 #### 多线程范式及其应用 多线程编程可以简化程序结构、利用并行性提高吞吐量、增强响应能力、最小化系统资源使用、简化实时应用程序等。...

    Java线程的基本概念

    Java线程是并发编程的重要组成部分,它允许程序中有多个执行流同时运行,提高了程序的效率和响应性。在Java中,线程的创建主要有两种方式:继承`Thread`类和实现`Runnable`接口。 1. 继承`Thread`类: 当一个类...

Global site tag (gtag.js) - Google Analytics