多线程
多线程
概念
单线程:同时只能执行一个任务
多线程:同时可以执行多个任务
并行:多个事件在同一时间,同时执行
并发:多个事件在同一时刻,交替执行
进程的特性:
- 独立性:进程之间相互独立,各自占据内存空间
- 动态性:进程动态的占据内存空间,cpu,网络等资源
- 并发性:多个进程一起竞争cpu来运行自己
关系:
线程是进程的执行单元
抢占cpu的是进程中的线程
线程抢占到CPU资源才能运行代码
多线程运行原理
CPU在多个线程间快速切换,造成"同时"运行的假象。
多线程的实现方式
- 继承Thread类的方式
- 实现Runnable接口的方式
- 实现Callable接口的方式
继承Thread类
- 定义类继承Thread类
- 重写run方法,编写新线程要执行的代码
- 创建子类对象调用start()方法
MyThread mt = new MyThread();//新建一个线程
mt.setName("线程名字");//设置线程名字
mt.start();//执行当前线程
Thread.currentThread().getName();//输出当前线程名字
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"-------------"+i);
}
}
}
public class Test001 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.setName("Thread线程1");
myThread.start();
MyThread myThread1 = new MyThread();
myThread1.setName("Thread线程2");
myThread1.start();
}
}
实现Runnable接口
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+ ": " + i );
}
}
}
public class Test001 {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable,"runnable线程1");
thread.start();
}
}
区别:
Thread类
静态方法
Constructor and Description |
---|
Thread() 分配一个新的 Thread 对象。 |
Thread(Runnable target) 分配一个新的 Thread 对象。 |
Thread(Runnable target, String name) 分配一个新的 Thread 对象。 |
Thread(String name) 分配一个新的 Thread 对象。 |
方法
long |
getId() 返回此线程的标识符。 |
---|---|
String |
getName() 返回此线程的名称。 |
void |
setName(String name) 将此线程的名称更改为等于参数 name 。 |
线程安全问题
多个线程同时操作共凉资源导致数据错乱,称为线程安全问题。
出现线程安全问题的原因
- 多线程并发
- 同时访问共享资源
线程同步的核心思想
加锁,把共享资源进行上锁,每次只能一个线程进入,操作完毕以后解锁,然后其他线程才能进来
线程同步
方式一:同步代码块
方式二:同步方法
方式三: Lock锁
同步代码块
synchronized(锁对象){
多条操作共享数据的代码
}
锁对象要求:
原则上:锁对象必须是同一个对象。
语法上:任意对象都可以作为锁。