Java线程的基本用法
摘要
多线程是软件编程中常用的基本技术,本文主要介绍了Java中线程的基本用法,包括线程创建、运行、停止和暂停,还介绍了线程常用的API以及线程的优先级。通过本文的学习,读者可以掌握线程的基本用法。
一、线程的创建及运行
线程的创建有三种方式:
1、继承Thread
2、实现Runnable
3、实现Callable
1.1、继承Thread
线程对象类直接继承Thread类,并重写Thread类的run()方法。如下所示:
public class ThreadTest extends Thread{
@Override
public void run() {
// 执行体代码
}
}
该线程对象的运行,如下所示:
public static void main(String[] args) {
Thread thread01 = new ThreadTest();
thread01.start();
}
1.2、实习Runnable
Runnable是一个接口,线程对象类可以实现该接口,并重写Runnable接口的run()方法。如下所示:
public class ThreadTest implements Runnable{
@Override
public void run() {
// 执行体代码
}
}
该线程对象的运行,如下所示:
public static void main(String[] args) {
ThreadTest thread01 = new ThreadTest();
new Thread(thread01, "Thread-name").start();
}
1.3、实现Callable
实现Callable接口的线程,创建过程如下:
- 1.创建一个线程,创建Callable的实现类Race,并且重写call方法;
- 2.得到Future对象;
- 3.获取返回值;
- 4.停止服务;
//返回Interger类型
public class ThreadTest implements Callable<Integer>{
@Override
public Integer call() {
//执行体代码
return Integer;
}
}
该线程对象的运行,如下所示:
public static void main(String[] args) {
ExecutorService ser = Executors.newFixedThreadPool(2);
ThreadTest threadTest = new ThreadTest();
//获取值
Future<Integer> result = ser.submit(threadTest);
try {
int numR = result.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
//停止服务
ser.shutdown();
}
1.4、执行run()与start()的区别
执行run()时,并不会启动该线程,只是相当于调用了一个普通方法。
执行start()时,启动该线程,start()方法会在该线程中自动调用到run()方法。
二、常用的线程API
2.1、currentThread()方法
currentThread()方法返回当前代码段所在的线程。
ThreadTest.java线程文件:
public class ThreadTest implements Runnable{
public ThreadTest(){
System.out.println("ThreadTest的构造函数所在线程:"+Thread.currentThread().getName());
}
@Override
public void run(){
System.out.println("ThreadTest的run函数所在线程:"+Thread.currentThread().getName());
}
}
Client.java程序入口文件:
public class Client{
public static void main(String[] args){
ThreadTest thread = new ThreadTest();
thread.start();
}
}
运行结果如下:
ThreadTest的构造函数所在线程:main
ThreadTest的run函数所在线程:Thread-0
由此可见线程类ThreadTest的构造函数是运行在main线程中的,而ThreadTest的run方法才是运行在ThreadTest线程中的。