————
并发:同一个时间点运行的多个程序
并行:同一个时间段运行的多个程序
————
进程
进程是每个程序都能获取到的内存资源;
单进程:获取到一个程序;
多进程:获取到两个程序。
线程
一个进程中多个任务的进行,每个任务就是一个执行路径,也就是一个线程;
创建线程的两种方式:
1、继承Thread类
class MyThread extends Thread{
@Override
public run(){//线程需要完成的逻辑
System.out.println(this.getName());
}
public static void main(String[] args) {
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.setName("线程1");//1.
my1.getName();//2.
Thread.currentThread().getName();//3.获取当前执行类的名字
}
}
2、接口Runnable
class MyThread implements Runnable{
@Override
public run(){//线程需要完成的逻辑
}
public static void main(){
MyThread my = new MyThread();
Thread t1 = new Thread(my,"窗口1");
Thread t2 = new Thread(my,"窗口2");//把my作为线程的参数
}
}
线程的生命周期
1、start();
线程启动的同时执行run();
2、wait();
进入等待状态,不占用资源
notify();
唤醒等待状态,执行wait之前的操作;
3、sleep();
线程睡眠;
4、join();
等待本线程终止,再执行其他线程;
5、yield();
线程礼让,抢到后放弃,重新抢
6、stop();
线程结束后,代码不再执行;
interrupt();
线程结束后,抛出异常,之后代码继续执行;
7、setDeamon();后台线程
若线程只有守护线程,则所有守护线程都终止
多线程
线程是依赖进程,进程是依赖系统去创建的,java是不能直接调用系统资源的;
线程安全
1、是否是多线程
2、是否有共享的数据资源
static int num=100;
3、是否有多条语句操作共享的数据资源
num–;分4步
*****主要作用:锁对象,把对象锁住,其他线程不能操作该对象,本线程执行里面的逻辑,执行完才能释放对象******
--同步代码块
格式:synchronized(对象){//任意对象,但是每一个线程只能执行操作一个对象;
逻辑代码;操作共享资源的代码(锁住的代码块)}
Object obj = new Object();
public void run() {
while(true) {
synchronized(obj) {//每个线程只能通过一个对象来操作
System.out.println(getName());
}
}
}
--同步方法
就是将syn同步在方法定义中,此时synchronized对应的对象为this
public synchronized void thread(){
//逻辑
}
--静态同步方法
就是将,对象为类的字节码;MyThread.class
public static synchronized void thread(){
//逻辑
}
线程通信
设置线程:
消费线程: