一、创建
1、新建一个类继承Thread类,重写run()方法,创建该类的对象,通过此对象调用start()方法
public class Demo01 {
public static void main(String[] args) {
ThreadDemo t = new ThreadDemo();
t.start();
}
}
class ThreadDemo extends Thread{
@Override
public void run() {
System.out.println("======");
}
}
2、匿名内部类
public class Demo01 {
public static void main(String[] args) {
new Thread(){
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": 111");
}
}.start();
}
}
3、实现Runable接口
class MyThread implements Runnable{
@Override
public void run() {
System.out.println("123");
}
}
public class Demo02 {
public static void main(String[] args) {
MyThread m1 = new MyThread();
Thread t = new Thread(m1);
t.start();
}
}
4、实现Callable接口
class NumThread implements Callable{
@Override
public Object call() throws Exception {
System.out.println("子线程");
return 100;
}
}
public class ThreadNew {
public static void main(String[] args) {
NumThread numThread = new NumThread();
FutureTask futureTask = new FutureTask<>(numThread);
new Thread(futureTask).start();
try {
Object o = futureTask.get();
System.out.println(o);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
注意:实现Callable接口创建线程和实现Runnable接口创建线程的区别
- call() 可以有返回值
- call() 可以抛出异常,被外面的操作捕获,获取异常的信息
- Callable 是支持泛型的
5、使用线程池
public class ThreadPool {
public static void main(String[] args) {
// 创建一个线程池
ExecutorService service = Executors.newFixedThreadPool(10);
// 执行指定的线程的操作。需要提供实现Runnable接口或者Callable接口的实现类对象
service.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": 111111");
}
});
// 关闭连接池
service.shutdown();
}
}
二、常用方法
- start():启动当前线程;调用当前线程的run()
- run(): 通常重写次方法,将要执行的代码写在此方法中
- currentThread(): 静态方法。返回执行当前代码的线程
- getName(): 获取当前线程的名字
- setName(): 设置当前线程的方法
- yield(): 释放当前cpu的执行权
- join(): 在线程a中调用线程b的join()方法,此时线程a就进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态
- stop(): 强制结束当前线程(已过时)
- sleep(long millitime): 当前线程睡眠指定的时间
- isAlive(): 判断当前线程是否存活
三、线程的状态