1、继承Thread类
Java提供了对线程这类事物的描述——Thread类。
a. 定义类继承Thread;
b. 复写Thread类中的run()方法。
目的:将自定义代码块存储在run方法中。
Tread类中定义了一个run方法,用于存储线程要运行的代码块。就相当于主线程代码存放在main中。
c. 调用线程的start方法
start:启动线程——–à调用run方法
开启线程的目的是为了运行指定代码,父类提供了空间,只需要沿袭父类功能,复写父类内容即可。因此,需要继承Thread,把run()的内容复写掉,建立线程要运行的代码。
2、声明实现Runnable接口的类
A.定义类,实现Runnable接口
[java] view plaincopy
{
private int tick = 100;
public void run()
{
while(true)
{
if (tick > 0)
{
System.out.println(Thread.currentThread().getName()+”——-sale:”+tick–);
}
}
}
}
B. 覆盖Runnable接口中的run方法
线程代码存放在接口的子类的run方法中
C. 通过Thread类建立线程对象
Ticket t = new Ticket();
D.将Runnable接口的子类对象(即刚刚new的Ticket())作为实际参数传递给Thread类的构造函数
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
自定义的run方法所属的对象是Runnable接口的子类对象。因此,要让线程去指定的
象的run方法。必须明确run方法所属的对象。
E. 调用Thread类的start方法开启线程并调用Runnable接口的run方法。
t1.start();
t2.start();
t3.start();
t4.start();
三、多线程的安全问题
安全问题原因:
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,
还未执行完,另一个线程参与进来执行,导致共享数据错误。
解决办法:
对多条【操作共享数据】的语句,一个线程在执行时,其他线程不可以参与执行,只能让一个线程先执行完。
Java对于多线程的安全问题提供了专业的解决方式——同步代码块。
synchronized()
{
}
对象如同锁,持有锁的线程才可以在同步中执行。没有持有锁的线程,即使获取cpu的权限,也无法进入同步代码块执行。
同步的前提:
Ø 必须要有两个或以上的线程。
Ø 必须是多个线程使用同一个锁。
必须保证同步中只能有一个线程
同步的好处:解决了多线程的安全问题。
同步的弊端:消耗了资源——在执行代码以外多了一个判断锁的过程(每次都判断)
[java] view plaincopy
四、多线程运行状态
五、获取线程对象以及名称
线程有自己的(默认)名称:Thread-编号 该编号从0开始。
currentThread()返回当前线程对象。currentThread()方法是静态的,说明它里面没有访问到特有对象数据。
static Thread currentThread():获取当前线程对象。
getName():获取线程名称。
设置线程名称:setName或者构造函数。(设置名称的意义:获取当前运行线程的名称,并进行判断)注:线程1和线程2里的x不是同一个。
l Thread-0进来,栈内存会给Thread-0分配内存空间–à此空间里有一个run()方法,run()方法里有一个x;
l Thread-1进来,栈内存给Thread-1分配内存空间–à此空间也有一个run方法,run方法里也有一个x。