线程是程序内的一行执行。每个程序可以有多个关联的线程。每个线程都有一个优先级,线程调度程序使用该优先级来确定哪个线程必须首先运行。 Java 提供了一个线程类,该类具有各种方法调用,以便通过提供构造函数和方法来对线程执行操作来管理线程的行为。
创建线程的方法
- 创建自己的类并扩展到父 Thread 类
- 实现 Runnable 接口。
下面是伪代码,您可以参考这些伪代码来更好地了解今后 Thread 类的线程。
图一:
// Way 1
// Creating thread By Extending To Thread class
class MyThread extends Thread {
// Method 1
// Run() method for our thread
public void run()
{
// Print statement
System.out.println(
"Thread is running created by extending to parent Thread class");
}
// Method 2
// Main driver method
public static void main(String[] args)
{
// Creating object of our thread class inside main()
// method
MyThread myThread = new MyThread();
// Starting the thread
myThread.start();
}
}
输出
Thread is running created by extending to parent Thread class
插图2:
// Way 2
// Creating thread using Runnable interface
class ThreadUsingInterface implements Runnable {
// Method 1
// run() method for the thread
public void run()
{
// Print statement
System.out.println("Thread is created using Runnable interface");
}
// Method 2
// Main driver method
public static void main(String[] args)
{
// Creating object of our thread class inside main()
// method
ThreadUsingInterface obj = new ThreadUsingInterface();
// Passing the object to thread in main()
Thread myThread = new Thread(obj);
// Starting the thread
myThread.start();
}
}
输出
Thread is created using Runnable interface
Java中的线程类
线程是一个以 method() 开头的程序,在此类中经常使用,仅称为 start() 方法。此方法查找 run() 方法(该方法也是此类的方法),并开始执行 run() 方法的主体。这里,请关注sleep()方法,稍后将讨论该方法。
Note: Every class that is used as thread must implement Runnable interface and over ride it’s run method.
用法:
public class Thread extends Object implements Runnable
该类的构造函数如下:
构造函数 | 执行的操作 |
---|---|
Thread() | 分配一个新的 Thread 对象。 |
Thread(Runnable target) | 分配一个新的 Thread 对象。 |
Thread(Runnable target, String name) | 分配一个新的 Thread 对象。 |
Thread(String name) | 分配一个新的 Thread 对象。 |
Thread(ThreadGroup group, Runnable target) | 分配一个新的 Thread 对象。 |
Thread(ThreadGroup group, Runnable target, String name) | 分配一个新的 Thread 对象,使其以指定的名称作为其运行对象,并属于由组引用的线程组。 |
Thread(ThreadGroup group, Runnable target, String name, long stackSize) | 分配一个新的 Thread 对象,使其以指定的名称作为其运行对象,属于 group 引用的线程组,并具有指定的堆栈大小。 |
Thread(ThreadGroup group, String name) | 分配一个新的 Thread 对象。 |
Thread类的方法:
现在让我们讨论所有方法该类的说明如下:
方法 | 执行的操作 |
---|---|
activeCount() | 返回当前线程的线程组及其子组中活动线程数量的估计值 |
checkAccess() | 判断当前运行的线程是否有权限修改该线程 |
clone() | 抛出CloneNotSupportedException,因为线程无法被有意义地克隆 |
currentThread() | 返回对当前正在执行的线程对象的引用 |
Java.lang.Thread | 将当前线程的堆栈跟踪打印到标准错误流 |
枚举(线程[] tarray) | 将当前线程的线程组及其子组中的每个活动线程复制到指定的数组中 |
getAllStackTraces() | 返回所有活动线程的堆栈跟踪映射 |
Java.lang.Thread | 返回该线程的上下文ClassLoader |
Java.lang.Thread | 返回当线程由于未捕获的异常而突然终止时调用的默认处理程序 |
getId() | 返回该线程的标识符 |
getName() | 返回该线程的名称 |
getPriority() | 返回该线程的优先级 |
getStackTrace() | 返回表示该线程的堆栈转储的堆栈跟踪元素数组 |
getState() | 返回该线程的状态 |
Java.lang.Thread | 返回该线程所属的线程组 |
Java.lang.Thread | 返回当该线程由于未捕获的异常而突然终止时调用的处理程序 |
holdsLock(Object obj) | 当且仅当当前线程持有指定对象的监视器锁时返回 true |
interrupt() | 中断该线程 |
interrupted() | 测试当前线程是否被中断 |
isAlive() | 测试该线程是否存活 |
isDaemon() | 测试该线程是否为守护线程 |
isInterrupted() | 测试该线程是否被中断 |
join() | 等待该线程死亡 |
join(long millis) | 最多等待 millis 毫秒该线程终止 |
Thread.start()和Thread.run()的区别 | 如果该线程是使用单独的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,此方法不执行任何操作并返回 |
Java.lang.Thread | 设置该线程的上下文ClassLoader |
setDaemon(boolean on) | 将此线程标记为守护线程或用户线程 |
setDefaultUncaughtExceptionHandler( Thread.UncaughtExceptionHandler 呃) | 设置当线程由于未捕获的异常而突然终止并且没有为该线程定义其他处理程序时调用的默认处理程序 |
setName(String name) | 将此线程的名称更改为等于参数名称。 |
setUncaughtExceptionHandler( Thread.UncaughtExceptionHandler 呃) | 设置当该线程由于未捕获的异常而突然终止时调用的处理程序 |
Java.lang.Thread | 更改该线程的优先级 |
sleep(long millis) | 使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,具体取决于系统计时器和调度程序的精度和准确性 |
start() | 导致该线程开始执行; Java虚拟机调用该线程的run方法 |
Java.lang.Thread | 返回该线程的字符串表示形式,包括线程的名称、优先级和线程组 |
yield() | 向调度程序提示当前线程愿意让出其当前对处理器的使用 |
还要记住有一些从类java继承的方法。 lang.Object 如下:
- equals()方法
- finalize()方法
- getClass()方法
- hashCode()方法
- notify()方法
- notify()和notifyAll()的区别
- Java.lang.Thread
- wait()方法
例子:Java程序演示Thread类的用法
// Java program Demonstrating Methods of Thread class
// Importing package
package generic;
// Class 1
// Helper class implementing Runnable interface
class Helper implements Runnable {
//
public void run() {
// Try block to check for exceptions
try {
// Print statement
System.out.println("thread2 going to sleep for 5000");
// Making thread sleep for 0.5 seconds
Thread.sleep(5000);
}
// Catch block to handle exception
catch (InterruptedException e) {
// Print statement
System.out.println("Thread2 interrupted");
}
}
}
// Class 2
// Helper class extending Runnable interface
public class Test implements Runnable {
// Method 1
// run() method of this class
public void run() {
// Thread run() method
}
// Method 2
// Main driver method
public static void main(String[] args) {
// Making objects of class 1 and 2 in main() method
Test obj = new Test();
Helper obj2 = new Helper();
// Creating 2 threads in main() method
Thread thread1 = new Thread(obj);
Thread thread2 = new Thread(obj2);
// Moving thread to runnable states
thread1.start();
thread2.start();
// Loading thread 1 in class 1
ClassLoader loader = thread1.getContextClassLoader();
// Creating 3rd thread in main() method
Thread thread3 = new Thread(new Helper());
// Getting number of active threads
System.out.println(Thread.activeCount());
thread1.checkAccess();
// Fetching an instance of this thread
Thread t = Thread.currentThread();
// Print and display commands
System.out.println(t.getName());
System.out.println("Thread1 name: " + thread1.getName());
System.out.println("Thread1 ID: " + thread1.getId());
// Fetching the priority and state of thread1
System.out.println("Priority of thread1 = " + thread1.getPriority());
// Getting the state of thread 1 using getState() method
// and printing the same
System.out.println(thread1.getState());
thread2 = new Thread(obj2);
thread2.start();
thread2.interrupt();
System.out.println("Is thread2 interrupted? " + thread2.interrupted() );
System.out.println("Is thread2 alive? " + thread2.isAlive());
thread1 = new Thread(obj);
thread1.setDaemon(true);
System.out.println("Is thread1 a daemon thread? " + thread1.isDaemon());
System.out.println("Is thread1 interrupted? " + thread1.isInterrupted());
// Waiting for thread2 to complete its execution
System.out.println("thread1 waiting for thread2 to join");
try {
thread2.join();
}
catch (InterruptedException e) {
// Display the exception along with line number
// using printStackTrace() method
e.printStackTrace();
}
// Now setting the name of thread1
thread1.setName("child thread xyz");
// Print and display command
System.out.println("New name set for thread 1" + thread1.getName());
// Setting the priority of thread1
thread1.setPriority(5);
thread2.yield();
// Fetching the string representation of thread1
System.out.println(thread1.toString());
// Getting list of active thread in current thread's group
Thread[] tarray = new Thread[3];
Thread.enumerate(tarray);
// Display commands
System.out.println("List of active threads:");
System.out.printf("[");
// Looking out using for each loop
for (Thread thread : tarray) {
System.out.println(thread);
}
// Display commands
System.out.printf("]\n");
System.out.println(Thread.getAllStackTraces());
ClassLoader classLoader = thread1.getContextClassLoader();
System.out.println(classLoader.toString());
System.out.println(thread1.getDefaultUncaughtExceptionHandler());
thread2.setUncaughtExceptionHandler(thread1.getDefaultUncaughtExceptionHandler());
thread1.setContextClassLoader(thread2.getContextClassLoader());
thread1.setDefaultUncaughtExceptionHandler(thread2.getUncaughtExceptionHandler());
thread1 = new Thread(obj);
StackTraceElement[] trace = thread1.getStackTrace();
System.out.println("Printing stack trace elements for thread1:");
for (StackTraceElement e : trace) {
System.out.println(e);
}
ThreadGroup grp = thread1.getThreadGroup();
System.out.println("ThreadGroup to which thread1 belongs " + grp.toString());
System.out.println(thread1.getUncaughtExceptionHandler());
System.out.println("Does thread1 holds Lock? " + thread1.holdsLock(obj2));
Thread.dumpStack();
}
}
输出:
3
main
Thread1 name: Thread-0
Thread1 ID: 10
Priority of thread1 = 5
RUNNABLE
Is thread2 interrupted? false
Is thread2 alive? true
Is thread1 a daemon thread? true
Is thread1 interrupted? false
thread1 waiting for thread2 to join
thread2 going to sleep for 5000 ms
thread2 going to sleep for 5000 ms
Thread2 interrupted
New name set for thread 1child thread xyz
Thread[child thread xyz, 5, main]
List of active threads:
[Thread[main, 5, main]
Thread[Thread-1, 5, main]
null
]
{Thread[Signal Dispatcher, 9, system]=[Ljava.lang.StackTraceElement;@33909752,
Thread[Thread-1, 5, main]=[Ljava.lang.StackTraceElement;@55f96302,
Thread[main, 5, main]=[Ljava.lang.StackTraceElement;@3d4eac69,
Thread[Attach Listener, 5, system]=[Ljava.lang.StackTraceElement;@42a57993,
Thread[Finalizer, 8, system]=[Ljava.lang.StackTraceElement;@75b84c92,
Thread[Reference Handler, 10, system]=[Ljava.lang.StackTraceElement;@6bc7c054}
sun.misc.Launcher$AppClassLoader@73d16e93
null
Printing stack trace elements for thread1:
ThreadGroup to which thread1 belongs java.lang.ThreadGroup[name=main, maxpri=10]
java.lang.ThreadGroup[name=main, maxpri=10]
Does thread1 holds Lock? false
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Unknown Source)
at generic.Test.main(Test.java:111)
相关用法
- Java Java.lang.Thread.activeCount()用法及代码示例
- Java Java.lang.Thread.checkAccess()用法及代码示例
- Java Java.lang.Thread.currentThread()用法及代码示例
- Java Java.lang.Thread.dumpStack()用法及代码示例
- Java Java.lang.Thread.enumerate()用法及代码示例
- Java Java.lang.Thread.getAllStackTraces()用法及代码示例
- Java Java.lang.Thread.getContextClassLoader()用法及代码示例
- Java Java.lang.Thread.getId()用法及代码示例
- Java Java.lang.Thread.getName()用法及代码示例
- Java Java.lang.Thread.getPriority()用法及代码示例
- Java Java.lang.Thread.getStackTrace()用法及代码示例
- Java Java.lang.Thread.getState()用法及代码示例
- Java Java.lang.Thread.getThreadGroup()用法及代码示例
- Java Java.lang.Thread.holdsLock()用法及代码示例
- Java Java.lang.Thread.interrupt()用法及代码示例
- Java Java.lang.Thread.interrupted()用法及代码示例
- Java Java.lang.Thread.isAlive()用法及代码示例
- Java Java.lang.Thread.isDaemon()用法及代码示例
- Java Java.lang.Thread.isInterrupted()用法及代码示例
- Java Java.lang.Thread.join()用法及代码示例
- Java Java.lang.Thread.run()用法及代码示例
- Java Java.lang.Thread.setContextClassLoader()用法及代码示例
- Java Java.lang.Thread.setDaemon()用法及代码示例
- Java Java.lang.Thread.setName()用法及代码示例
- Java Java.lang.Thread.setPriority()用法及代码示例
注:本文由纯净天空筛选整理自佚名大神的英文原创作品 Java.lang.Thread Class in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。