1.线程的创建:(两种方法)
1)继承Thread类,重写里面的run方法,将要运行的代码放在run方法中
2)实现Runnalble接口,实现里面的run方法,将线程要运行的程序放在run方法中,
创建Thread线程,将Runnable对象作为参数传递给Thread对象,调用Thread对象的start方法,使Runnable中的run方法运行:如:
package com.itcast.day10;
/**
* 创建一个类实现Runnable接口
* @author Yxx
*
*/
class Cyte implements Runnable{
private int i=100;
public void run() {
while(true){
if(i>0){
System.out.println(Thread.currentThread().getName()+"------"+i--);
}
}
}
}
/**
*
* @author Yxx
*
*/
public class ThreadDemo {
public static void main(String[] args) {
//创建一个Runable实例
Cyte c = new Cyte();
//创建线程将Runnable接口实例作为参数传给Thread构造函数
Thread t = new Thread(c);
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
Thread t3 = new Thread(c);
Thread t4 = new Thread(c);
//将线程启动
t.start();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
2.线程的几种状态
1.被创建:当用new关键字创建一个线程实例,但还没有调用start方法
2.运行:线程调度程序将处于就绪状态的线程置为当前线程时,线程为允许状态,开始执行run方法中的代码
3.就绪状态:当线程调用了start方法之后线程进入了就绪状态,等待着线程调度程序将线程置为当前线程,线程才会处于运行状态。
4.阻塞:当程序正在运行状态,调用了wait方法或者sleep方法时,程序处于阻塞状态,当程序调用notify方法时,程序才会被唤醒,但不一定马上进入运行状态,而是在就绪状态等待
5.死亡:当一个线程中的run方法里面的程序执行完成,或者调用了stop方法,程序就会处于死亡状态,对于已经死亡的线程,无法再调用start使他进入就绪状态
代码同步
对于多个线程访问同一个共享资源,有时候会出现数据共享的错误,原因就是因为cpu的调度不是人为能控制,当cpu在执行完if判断之后,当前线程处于阻塞状态,而cpu去执行其他权限更高的程序,cpu会在当前执行处记住一个地址,等cpu执行完其他程序,它就会更据那个地址继续向前执行,在执行过程中可能i的值已经到了1,而现在又不用判断,所以就出现了0,-1的现象
3.代码同步
对于多个线程访问同一个共享资源,有时候会出现数据共享的错误,原因就是因为cpu的调度不是人为能控制,当cpu在执行完if判断之后,当前线程处于阻塞状态,而cpu去执行其他权限更高的程序,cpu会在当前执行处记住一个地址,等cpu执行完其他程序,它就会更据那个地址继续向前执行,在执行过程中可能i的值已经到了1,而现在又不用判断,所以就出现了0,-1的现象
class Cyte implements Runnable{
private int i=100;
public void run() {
while(true){
if(i>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println(Thread.currentThread().getName()+"------"+i--);
}
}
}
}
如果需要对操作共享资源的代码块添加代码同步。如:
class Cyte implements Runnable{
private int i=100;
Object o = new Object();
public void run() {
while(true){
synchronized (o) {
if(i>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"------"+i--);
}
}
}
}
}