本文共 3567 字,大约阅读时间需要 11 分钟。
1) 定义子类继承Thread类。
2) 子类中重写Thread类中的run方法。 3) 创建Thread子类对象,即创建了线程对象。 4) 调用线程对象start方法:启动线程,调用run方法。1)定义子类,实现Runnable接口。
2)子类中重写Runnable接口中的run方法。 3)通过Thread类含参构造器创建线程对象。 4)将Runnable接口的子类对象作为实际参数传递给Thread类的构造方法中。 5)调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法。1)void start(): 启动线程,并执行对象的run()方法。
2)run(): 线程在被调度时执行的操作。 3)String getName(): 返回线程的名称。 4)void setName(String name):设置该线程名称。 5)static currentThread(): 返回当前线程。 6)static void yield(): : 线程让步7)join() : : 当某个程序执行流中调用其他线程的 join() 方法时,调用
线程将被阻塞,直到 join() 方法加入的 join 线程执行完为止。8)static void sleep(long millis) :(指定时间:毫秒)
令当前活动线程在指定时间段内放弃对CPU控制,使其他线程有机会被执行,时间到后重排队。
抛出InterruptedException异常。
9)stop(): 强制线程生命期结束。
10)boolean isAlive(): : 返回boolean,判断线程是否还活着。Java中的线程分为两类:一种是 守护线程,一种是 用户线程。
要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的 五种状态:
1、新建: 当一个Thread类或其子类的对象被声明并创建时,新生的线程对象
处于新建状态。 2、就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片, 此时它已具备了运行的条件。 3、运行:当就绪的线程被调度并获得处理器资源时,便进入运行状态, run() 方法定义了线程的操作和功能。 4、阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出 CPU 并临时中止自己的执行,进入阻塞状态。 5、死亡:线程完成了它的全部工作或线程被提前强制性地中止。Java对于多线程的安全问题提供了专业的解决方式: 对于多线程的安全问题提供了专业的解决方式:
synchronized ( 对象){
// 需要被同步的代码; } synchronized 锁的对象可以是this线程本身,也可以是其他对象。synchronized 还可以放在方法声明中,表示整个方法为同步方法。例如:
public synchronized void show (String name){ …//方法体}
在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。
class Singleton { private static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(instance == null){ instance=new Singleton(); } } } return instance; } }class TestSingleton{ public static void main(String[] args){ Singleton s1=Singleton.getInstance(); Singleton s2=Singleton.getInstance(); System.out.println(s1==s2); } }
1、 死锁
2、 解决方法
转载地址:http://ybhpo.baihongyu.com/