本节课程将学习以下内容:
进程和线程的关系
多线程程序运行模式
定义线程的方法
控制线程的常用函数
多线程的数据安全
同步线程的方法
深入synchronized关键字
进程和线程的关系 多进程:
在操作系统中能(同时)运行多个任务(程序)。
多线程:
在同一个应用程序中有多个顺序流(同时)进行。
多线程程序运行模式 线程的执行过程:
定义线程的方法 方法1:
定义一个线程类,它继承类Thread并重写其中的方法run(),方法run()称为线程体;
方法2:
提供一个实现接口Runnable的类作为线程的目标对象,在初始化一个Thread类或者Thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体。
例子1: 1.新建一个FirstThread.java的源文件:
1 2 3 4 5 6 7 8 class FirstThread extends Thread { public void run () { for (int i = 0 ; i < 100 ; i++) { System.out.println("FirstThread-->" + i); } } }
2.新建一个Demo01.java的源文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 class Demo01 { public static void main (String[] args) { FirstThread thread01 = new FirstThread(); thread01.start(); for (int i = 0 ; i < 100 ; i++) { System.out.println("main-->" + i); } } }
3.新建一个RunnableImpl.java的源文件:
1 2 3 4 5 6 7 8 class RunnableImpl implements Runnable { public void run () { for (int i = 0 ; i < 100 ; i++) { System.out.println("Runnable-->" + i); } } }
4.新建一个Demo02.java的源文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Demo02 { public static void main (String[] args) { RunnableImpl ri = new RunnableImpl(); Thread t = new Threadj(ri); t.start(); System.out.println(t.getPriority()); t.setPriority(Thread.MAX_PRIORITY); } }
控制线程的常用函数 中断线程:
Thread.sleep(2000);线程睡眠2000毫秒。 Thread.yield();线程自动让出cpu。
设置线程的优先级:
getPriority(); setPriority();
多线程的数据安全 同步线程的方法
多线程共用同一份数据的时候,会出现某种错误;
因此需要在同步线程。
例子2: 1.新建一个MyThread.java的源文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class MyThread implements Runnable { int i = 100 ; public void run () { while (true ) { synchronized (this ) { System.out.println(Thread.currentThread().getName() + i); i--; Thread.yield(); if (i < 0 ) { break ; } } } } }
2.新建一个Demo03.java的源文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Demo03 { public static void main (String[] args) { MyThread myThread = new MyThread(); Thread t1 = new Thread(myThread); Thread t2 = new Thread(myThread); t1.setName("线程a" ); t2.setName("线程b" ); t1.start(); t2.start(); } }
深入synchronized关键字
同步锁,它锁住的是对象。 如果一个线程获得了一个对象的同步锁,那么这个对象上面的所有的其它的同步代码都是不能够被其它线程执行的,都需要等待同步锁被释放后,才能够进行。
例子3: 1.新建一个名为Service.java的源文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Service { public voi fun1 () { synchronized (this ) { try { Thread.sleep(3000 ); } catch (Exception e) { System.out.println(e); } System.out.println("fun1" ); } } public synchronized voi fun2 () { System.out.println("fun2" ); } }
2.新建一个名为MyThread1.java的源文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 class MyThread1 implements Runnable { private Service service; public MyThread1 (Service service) { this .service = service; } public void run () { service.fun1(); } }
3.新建一个名为MyThread2.java的源文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 class MyThread2 implements Runnable { private Service service; public MyThread2 (Service service) { this .service = service; } public void run () { service.fun2(); } }
4.新建一个名为Demo04.java的源文件:
1 2 3 4 5 6 7 8 9 10 11 12 class Demo04 { public static void main (String[] args) { Service service = new Service(); Thread t1 = new Thread(new MyThread1(service)); Thread t2 = new Thread(new MyThread2(service)); t1.start(); t2.start(); } }