1.进程与线程
进程的概念:
- 应用程序的的执行实例,有独立的内存空间和系统资源。
线程的概念:
- CPU调度和分派的基本单位,应用程序的的执行实例。
2.多线程
什么是多线程:
- 如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”。
- 多个线程交替占用CPU资源,而非真正的并行执行 。
多线程的优势:
- 充分利用CPU的资源;
- 简化编程模型;
- 带来良好的用户体验。
什么是主线程:
- main()方法即为主线程入口;
- 产生其他子线程的线程;
- 必须最后完成执行,因为它执行各种关闭动作。
public static void main(String args[]) {
Thread t= Thread.currentThread();
System.out.println("当前线程是: "+t.getName());
t.setName("MyJavaThread");
System.out.println("当前线程名是: "+t.getName());
}
使用线程的步骤:
- 定义线程
- 创建线程对象
- 启动线程
- 终止线程
在Java中创建线程的三种方式:
- 继承java.lang.Thread类
public class MyThread extends Thread {
public void run(){
for (int i = 1; i <=20; i++) {
System.out.println(i+".你好,来自线程"+Thread.currentThread().getName());
}
}
public static void main(String[] args) {
Thread thread1=new Thread();
Thread thread2=new Thread();
thread1.start();
thread2.start();
}
}
- 实现java.lang.Runnable接口
public class MyThread implements Runnable {
public void run(){
for (int i = 1; i <=20; i++) {
System.out.println(i+".你好,来自线程"+Thread.currentThread().getName());
}
}
public static void main(String[] args) {
Runnable runnable=new MyThread();
Thread thread1=new Thread(runnable);
Thread thread2=new Thread(runnable);
thread1.start();
thread2.start();
}
}
- 实现java.lang.Callable接口
public class CallableTest implements Callable<String> {
@Override
public String call() throws Exception {
StringBuffer s=new StringBuffer();
for (int i = 1; i <=20 ; i++) {
System.out.println(Thread.currentThread().getName()+"第"+i+"次运行");
s.append(Thread.currentThread().getName()+"第"+i+"次运行");
}
return s.toString();
}
public static void main(String[] args) {
Callable<String> c=new CallableTest();
FutureTask<String> task1=new FutureTask<>(c);
FutureTask<String> task2=new FutureTask<>(c);
Thread tk1=new Thread(task1);
Thread tk2=new Thread(task2);
tk1.start();
tk2.start();
}
}
比较两种创建线程的方式:
继承Thread类:
- 编写简单,可直接操作线程
- 适用于单继承
实现Runnable接口:
- 避免单继承局限性
- 便于共享资源
线程的状态:
线程调度:
方法 | 说明 |
void setPriority(int newPriority) | 更改线程的优先级 |
static void sleep(long millis) | 在指定的毫秒数内让当前正在执行的线程休眠 |
void join() | 等待该线程终止 |
static void yield() | 暂停当前正在执行的线程对象,并执行其他线程 |
void interrupt() | 中断线程 |
boolean isAlive() | 测试线程是否处于活动状态 |
测试更改线程的优先级:
public class PriorityTest {
public static void main(String[] args) {
Thread mainThread=Thread.currentThread();
Thread myThread=new Thread(new MyThread());
System.out.println("*******显示默认优先级**********");
System.out.println("主线程名:"+mainThread.getName()+"优先级:"+mainThread.getPriority());
System.out.println("子线程名:"+myThread.getName()+"优先级:"+myThread.getPriority());
System.out.println("*******修改优先级之后**********");
mainThread.setPriority(Thread.MAX_PRIORITY);
myThread.setPriority(Thread.MIN_PRIORITY);
System.out.println("主线程名:"+mainThread.getName()+"优先级:"+mainThread.getPriority());
System.out.println("子线程名:"+myThread.getName()+"优先级:"+myThread.getPriority());
}
}