学习内容:
一个进程至少包含一个线程。一对多的关系。
线程和进程:一个进程可以有多个线程。
进程往往是应用程序执行任务本身。
线程是应用程序向CPU请求的各个操作步骤。
实现多线程的方式:
1、继承Thread类、重写run方法、构建对象,调用start方法
public class Test extends Thread {
@Override
public void run() {
for (int i = 0;i < 20;i++)
{
System.out.println((i+1)+"你好,来自线程"+Thread.currentThread().getName());
}
}
public static void main(String[] args) {
Test t1 = new Test();
Test t2 = new Test();
t1.start();
t2.start();
}
}
2、实现runnable接口、重写run方法、构建对象、装入Thread类中
调用Thread对象的start方法
public class Test2 implements Runnable {
@Override
public void run() {
for (int i = 0;i < 20;i++)
{
System.out.println((i+1)+"你好,来自线程"+Thread.currentThread().getName());
}
}
public static void main(String[] args) {
Test2 t = new Test2();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t2.start();
}
}
当一个类继承Thread类,可以看作一个有具体逻辑的Thread类,代码重用性高,但是java只能继承一个类
当一个类实现Runnable接口,这个类可以看作有一定多线程附加功能的普通类,可以继承其他类,更灵活,实际工作主要使用。
线程调度:线程调度指按照特定机制为多个线程分配CPU的使用权
方法:
方法 | 说明 |
---|---|
void setPriority(int newPriority) | 更改线程的优先级 |
static void sleep(long millis) | 在指定的毫秒级数内让当前正在执行的线程休眠 |
void join() | 等待该线程终止 |
static void yield() | 暂停当前正在执行的线程对象,并执行其他线程 |
void interrupt() | 中断线程 |
boolean isAlive() | 测试线程是否处于活动状态 |
3、Callable接口
Callable接口的方法是call() ,带返回值(泛型)
public class TestCallable implements Callable<String> {
@Override
public String call() throws Exception {
StringBuffer sb = new StringBuffer();
for(int i = 0;i < 10;i++)
{
//System.out.println(Thread.currentThread().getName()+":第"+(i+1)+"次运行");
sb.append(Thread.currentThread().getName()+":第"+(i+1)+"次运行"+"\n");
}
return sb.toString();
}
public static void main(String[] args) throws ExecutionException,InterruptedException {
Callable<String> t = new TestCallable();
FutureTask<String> task1 = new FutureTask<>(t);
FutureTask<String> task2 = new FutureTask<>(t);
Thread t1 = new Thread(task1,"线程1");
Thread t2 = new Thread(task2,"线程2");
t1.start();
System.out.println(task1.get());
t2.start();
System.out.println(task2.get());
}
}