文章目录
- 什么是线程、多线程
- 多线程的创建
- 方式一:继承Thread类
- 方式二:实现Runnable接口
- 匿名内部类方式实现Runnable接口
- 方式三: JDK5.0新增:实现Callable接口
- Thread的常用方法
- Thread构造器
- Thread获取和设置线程名称
- 获取正在运行的线程
- Thread类的线程休眠方法
什么是线程、多线程
多线程是指从软硬件上实现多条执行流程的技术
多线程的创建
方式一:继承Thread类
Java是通过java.lang.Thread类来代表线程的
按照面向对象的思想,Thread类提供了实现多线程的方式
调用start启动线程,只有调用start方法才是启用一个新的线程(直接调用run方法会当成普通方法执行,此时相当于还是单线程执行)
创建一个子线程类
public class Test {
public static void main(String[] args) {
Mythread mythread = new Mythread();
mythread.start();
for (int i =0;i<10;i++){
System.out.println(i+"主线程被启动");
}
}
}
class Mythread extends Thread{
@Override
public void run() {
for (int i =0;i<10;i++){
System.out.println(i+"子线程被启动");
}
}
}
主线程和子线程是同时运行的(不分先后)
方式二:实现Runnable接口
public class Test {
public static void main(String[] args) {
Mythread mythread = new Mythread();
Thread thread = new Thread(mythread);
thread.start();
for (int i =0;i<10;i++){
System.out.println(i+"主线程被启动");
}
}
}
class Mythread implements Runnable{
@Override
public void run() {
for (int i =0;i<10;i++){
System.out.println(i+"子线程被启动");
}
}
}
匿名内部类方式实现Runnable接口
public class Test2 {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++){
System.out.println(i+"子线程运行");
}
}
});
thread.start();
}
}
前两种线程创建方式都存在一个问题:他们重写的run方法均不能直接返回结果
方式三: JDK5.0新增:实现Callable接口
public class Test2 {
public static void main(String[] args) throws Exception {
Mythread1 mythread1 =new Mythread1();
FutureTask<String> futureTask =new FutureTask<>(mythread1);
Thread thread =new Thread(futureTask);
thread.start();
System.out.println(futureTask.get());
}
}
class Mythread1 implements Callable<String>{
@Override
public String call() throws Exception {
return "SSSS";
}
}
Thread的常用方法
Thread构造器
Thread获取和设置线程名称
public class Test3 {
public static void main(String[] args) {
MyThread mythread = new MyThread();
mythread.start();
}
}
class MyThread extends Thread{
@Override
public void run() {
for (int i = 0 ;i<10;i++){
System.out.println(getName()+"线程正在运行");
}
}
}
也可以在MyThread中定义有参构造,直接定义线程名称
public class Test3 {
public static void main(String[] args) {
MyThread mythread = new MyThread("1");
mythread.start();
}
}
class MyThread extends Thread{
public MyThread() {
}
public MyThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0 ;i<10;i++){
System.out.println(getName()+"线程正在运行");
}
}
}
获取正在运行的线程
Thread m = Thread.currentThread( ); //获取当前正在运行的线程