1. 进程:是一个正在执行的程序
--每个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个 控制单元
线程:就是进程中的一个独立的控制单元
--线程在控制进程的执行
2. 多线程的创建方式: (2种)
---第一种方式: 继承Thread
--第一步,创建一个类继承Thread
--第二步,复写Thread类中的run方法
--目的,将自定义代码存储在run方法,让线程运行
--第三部,调用线程的start方法
-作用是启动线程
-调用run方法
---第二种方式: 实现Runnable接口
--第一步,创建类实现Runnable接口
--第二步,覆盖Runnable接口中的run方法
--第三步,通过Thread类建立线程对象
--第四部,将Runnble接口的子类对象作为实际参数传递给Thread类的构造函数
--第五步,调用Thread类的start方法方法开启线程并调用Runnble接口子类的run方法
3. static Thread currentThread().getName():获取当前线程名称
4. 实现方式和继承方式有什么不同:
---实现Runnable接口,实现了数据共享
---实现的好处,避免了继承的局限性
---定义线程时,建立使用实现方式
---继承Thread,线程代码存放在Thread子类中
---实现方式
5. 多线程的安全问题:
---同步代码块:synchronized(对象)
{
同步的代码
}
---同步函数:写在方法上
7. 售票的实例,引出了第二种创建线程的方式(*******)
|-- 实现Runnable接口,覆盖run方法
|-- 建立Thread类对象,传递实现Runnable接口的子类对象
|-- 调用Thread类中的run方法
|-- 第二种方式,可以实现对象中的数据共享
|-- 避免的单继承的局限性
8. 安全问题(synchronized)
9. 同步代码块
synchronized(this) ****同步
{
}
synchronized(类名.class)
{
}
10. 安全问题的解决
|-- 数据被多个线程访问
|-- 这些线程是不是持有同一把锁
11. 死锁的案例
12. 安全高效的懒汉式
13. Thread方法
|-- run负责线程中运行的代码
|-- Thread(String name),构造的时候,传递线程名
|-- getName()获取线程名
|-- setName()设置线程名
|-- Thread.currentThread().getName()获取线程名,在非Thread子类中使用
|-- start()开启线程,JVM调用线程的run方法
//卖票程序代码示例
class Ticket implements Runnable//extends Thread
{
private int tick = 1000;
Object obj = new Object();
public void run()
{
while(true)
{
synchronized(obj)//同步代码块
{
if(tick>0)
try
{
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"-sale: "+tick--);
}
catch (Exception e)
{
}
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
t1.start();
t2.start();
t3.start();
}
}
//代码示例2
class Test extends Thread
{
//private String name;
public void run()
{
for (int x=0;x<20 ;x++ )
{
System.out.println(Thread.currentThread().getName()+" RUN--------");
}
}
}
class ThreadDemo
{
public static void main(String[] args)
{
private String name;
Test t1 = new Test();
Test t2 = new Test();
Test t3 = new Test();
Test t4 = new Test();
t1.start();
t2.start();
t3.start();
t4.start();
for (int x=0;x<100 ;x++ )
{
System.out.println(Thread.currentThread().getName()+" MAIN************");
}
}
}
单例模式 (安全的代码示例)
class Single
{
private Single(){}
private static Single s = null;
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
{
try{Thread.sleep(15);}catch(Exception e){}
s = new Single();
}
return s;
}
}
return s;
}
}
class TestSingle implements Runnable
{
public void run()
{
while(true)
{
Single s = Single.getInstance();
System.out.println(s);
}
}
}
class SafeSingle
{
public static void main(String[] args)
{
TestSingle t = new TestSingle();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t2.start();
}
}