————
并发:同一个时间点运行的多个程序
并行:同一个时间段运行的多个程序
————

进程

进程是每个程序都能获取到的内存资源;
单进程:获取到一个程序;
多进程:获取到两个程序。

线程

一个进程中多个任务的进行,每个任务就是一个执行路径,也就是一个线程;

创建线程的两种方式:

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(){
//逻辑
}

线程通信

设置线程:
消费线程: