说起线程那必须得说进程和线程的概念了
一:什么是进程?
进程:一个运行的应用程序就叫做进程,列如:QQ,微信,电脑管家,进程里面包含了很多线程。
二:什么是线程?
线程:一个独立的正在运行的任务,叫做线程,比如说我们微信中的视频聊天,或者跟某人发消息,单独的叫做线程。
三:什么是多线程?
多线程:多个正在运行的任务,叫做多线程。比如我微信中我们既能跟张三发消息,同时还可以给李四通视频电话,这种就叫做多线程,在一个进程当中有多个任务在执行。
四:什么是高并发?
高并发:其实是多个任务再一个线程中运行就是高并发
五:实现线程的几种方法
1.继承extends Thread 重写run方法。
调用start()方法启动线程。
public class ThreadService {
public static void main(String[] args) {
//创建对象
Test test = new Test();
//启动线程
test.start();
}
//新建一个类,继承Thread类
static class Test extends Thread {
//重新run方法
@Override
public void run() {
System.out.println("我调用了thread线程");
}
}
}
2.实现implements Runnable 接口
将方法封装在Thread,调用start()方法。
public class RunnableService {
public static void main(String[] args) {
//创建对象
Test test = new Test();
//创建新城
Thread thread = new Thread(test);
//启动线程
thread.start();
}
//新建一个类,实现Runnable接口
static class Test implements Runnable {
//重新run方法
@Override
public void run() {
System.out.println("我调用了Runnable线程");
}
}
}
3.使用Callable和Future创建线程
和Runnable接口不一样,Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能要强大。call()方法可以有返回值,call()方法可以声明抛出异常
public class CallableService {
public static void main(String[] args) throws Exception{
//创建对象
Test test = new Test();
Integer call = test.call();
System.out.println(call);
}
//新建一个类实现Callable接口
static class Test implements Callable {
@Override
public Integer call() throws Exception {
int a = 10;
int b = 20;
return a+b;
}
}
4. .使用线程池例如用Executor框架
最大优点是把任务的提交和执行解耦。要执行任务的人只需把Task描述清楚,然后提交即可。这个Task是怎么被执行的,被谁执行的,什么时候执行的,提交的人就不用关心了。
具体点讲,提交一个Callable对象给ExecutorService(如最常用的线程池ThreadPoolExecutor),将得到一个Future对象,调用Future对象的get方法等待执行结果就好了
Executor框架的内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。
六:Thread类的常用方法:
- start():启动当前线程并调用线程的run()方法
- run():将创建线程要执行的操作声明在此
- currentThread():静态方法,放回当前代码执行的线程
- getName():获取当前线程的名字
- setName():设置当前线程的名字
- yield():释放当前cpu的执行权
- join():在线程A中调用线程B的join方法,使得线程A进入阻塞状态,直到线程B完全执行完,线程A才结束阻塞状态
- stop():已过时,在执行此方法时,强制结束该线程
- sleep(long long millis):让当前线程睡眠指定的millis毫秒时间内(睡眠即当前线程为阻塞状态)
- isAlive():判断当前线程是否还存活