网站空间送域名价格表,商机网wordpress模板,广告设计公司名称大全简单大气,专门做网站一、基本概念
进程#xff1a;一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元#xff0c;在传统的操作系统中#xff0c;进程既是基本的分配单元#xff0c;也是基本的执行单元。线程#xff1a;操作系统中能够进行运算的最…一、基本概念
进程一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元在传统的操作系统中进程既是基本的分配单元也是基本的执行单元。线程操作系统中能够进行运算的最小单位它被包含在进程之中是进程中的实际运作单位。简单理解应用软件中相互独立可以同时运行的功能
多线程 作用提高效率 应用场景多件事情同时运行 3.并发和并行
并发在同一时刻有多个指令在CPU上交替执行并行在同一时刻有多个指令在CPU上同时执行
二、多线程实现方法
1.继承Thread类 创建继承Thread的子类 重写Thread类的run()方法 创建Thread类的子类的对象。 通过此对象调用start()来启动一个线程。
public class MyThread extends Thread {public void run(){for (int i 0; i 100; i) {System.out.println(getName()HelloWord);}}public static void main(String[] args) {MyThread t1 new MyThread();MyThread t2 new MyThread();t1.start();t2.start();}
} 2.实现Runnable接口
定义一个类实现Runnable接口重写里面的Run()方法创建自己的类的对象创建一个Thread类的对象调用start()开起线程
public class RunnableThread {public static void main(String[] args) {MyRun mr new MyRun();Thread t1 new Thread(mr);t1.start();Thread t2 new Thread(mr);t2.start();}
}class MyRun implements Runnable {Overridepublic void run() {for (int i 1; i 100; i) {System.out.println(Thread.currentThread().getName():/ti);}}
} 3.利用Callable接口和Future接口特点:可以获取到多线程运行的结果 创建一个类MyCallable实现callable接重写call (是有返回值的表示多线程运行的结果) 创建MyCallable的对象(表示多线程要执行的任务) 创建FutureTask的对象(作用管理多线程运行的结果) 创建Thread类的对象并启动(表示线程)
三种方式对比 三、常见的成员方法 四、线程的生命周期
线程的动态特征表明它由创建而生由调度而执行由撤销而消亡。说明线程具有一个从生到死的生命周期。
新建当一个Thread类或其子类的对象被声明并创建时新生的线程对象处于新建状态
就绪处于新建状态的线程被start()后将进入线程队列等待cpu时间片此时它已经具备了运行 的条件
运行当就绪的线程被调度并获得处理器资源时便进入运行状态run()方法定义了线程的操作 和功能
阻塞在某种特殊情况下被人为挂起或者执行输入输出操作时让出cpu并临时终止你自己的执 行进入阻塞状态
死亡线程完成了它的全部工作或线程被提前强制性地中止 五、多线程安全性问题的解决
如果有多个线程在同时运行而这些线程可能会同时运行这段代码。 程序每次运行结果和单线程运行的结果是一样的而且其他的变量的值也和预期的是一样的就是线程安全的。 线程安全问题都是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作而无写操作一般来说这个全局变量是线程安全的若有多个线程同时执行写操作一般都需要考虑线程同步否则的话就可能影响线程安全。
解决方法
1.同步代码块
将操作共享的代码锁起来锁默认打开有一个线程进去了锁自动关闭里面的代码全部执行完毕线程出来锁自动打开 public class MyThread extends Thread {static int a 0;static Object obj new Object();public void run(){while(true){synchronized (obj){if(a100){try {Thread.sleep(10);} catch (InterruptedException e) {throw new RuntimeException(e);}a;System.out.println(getName()卖第a);}elsebreak;}}}
}
public class Test {public static void main(String[] args) {MyThread t1 new MyThread();MyThread t2 new MyThread();MyThread t3 new MyThread();t1.setName(窗口1);t2.setName(窗口2);t3.setName(窗口3);t1.start();t2.start();t3.start();}
} 2.同步方法
将 synchronized关键字加在方法上锁住方法里的所有代码锁对象不能自己制定非静态的同步方法同步监视器是this静态的同步方法同步监视器是当前类的字节码文件对象格式