1.单线程和多线程的区别?
你早上上班,正要打卡的时候,手机响了。。你如果先接了电话,等接完了,在打卡,就是单线程。
如果你一手接电话,一手打卡。就是多线程。
这两件事的结果是一样的。。你接了电话且打了卡。
(1)最常见的一个线程例子:
package com.ggx.thread; public class OnlyThread{ public static void main(String[] args){ System.out.println("我就是一个线程"); } }
当程序启动运行时,就自动产生一个线程,主方法main就在这个主线程上运行。我们的程序都是由线程来执行的。
(2)控制该线程的行为
package com.ggx.thread; public class OnlyThread { @SuppressWarnings("static-access") public static void main(String[] args) { Thread thread = Thread.currentThread();// 获取当前线程的引用(这里并没有创建新的线程) thread.setName("我是孤零零的一个线程");// 设置当前线程名称 System.out.println(thread.getName() + ":正在运行"); for (int i = 0; i <= 5; i++) //当前线程循环睡眠 { try { System.out.println(thread.getName()+"第:" + i+"次睡眠,当前时间"+System.currentTimeMillis()); thread.sleep(5000);//让当前线程睡眠五秒钟 System.err.println(thread.getName()+"第:" + i+"次觉醒,当前时间"+System.currentTimeMillis()); thread.sleep(1000);//这里是为了方便区分控制台的输出,因为两次间隔毫秒数相同,打印的顺序会有错乱让线程睡了一秒,这样输出顺序容易观察 System.out.println();//换行 } catch (InterruptedException e) { System.out.println(thread.getName()+"异常"); e.printStackTrace(); } } } } </span>
程序运行结果:
我是孤零零的一个线程:正在运行
我是孤零零的一个线程第:0次睡眠,当前时间1439734065648
我是孤零零的一个线程第:0次觉醒,当前时间1439734070663
我是孤零零的一个线程第:1次睡眠,当前时间1439734071666
我是孤零零的一个线程第:1次觉醒,当前时间1439734076668
我是孤零零的一个线程第:2次睡眠,当前时间1439734077670
我是孤零零的一个线程第:2次觉醒,当前时间1439734082673
我是孤零零的一个线程第:3次睡眠,当前时间1439734083675
我是孤零零的一个线程第:3次觉醒,当前时间1439734088687
我是孤零零的一个线程第:4次睡眠,当前时间1439734089690
我是孤零零的一个线程第:4次觉醒,当前时间1439734094694
我是孤零零的一个线程第:5次睡眠,当前时间1439734095696
我是孤零零的一个线程第:5次觉醒,当前时间1439734100711
我是孤零零的一个线程第:0次睡眠,当前时间1439734065648
我是孤零零的一个线程第:0次觉醒,当前时间1439734070663
我是孤零零的一个线程第:1次睡眠,当前时间1439734071666
我是孤零零的一个线程第:1次觉醒,当前时间1439734076668
我是孤零零的一个线程第:2次睡眠,当前时间1439734077670
我是孤零零的一个线程第:2次觉醒,当前时间1439734082673
我是孤零零的一个线程第:3次睡眠,当前时间1439734083675
我是孤零零的一个线程第:3次觉醒,当前时间1439734088687
我是孤零零的一个线程第:4次睡眠,当前时间1439734089690
我是孤零零的一个线程第:4次觉醒,当前时间1439734094694
我是孤零零的一个线程第:5次睡眠,当前时间1439734095696
我是孤零零的一个线程第:5次觉醒,当前时间1439734100711
当程序启动运行时,就自动产生一个线程,主方法main就在这个主线程上运行。我们的程序都是由线程来执行的。
线程在建立后并不马上执行run方法中的代码,而是处于等待状态。线程处于等待状态时,可以通过Thread类的方法来设置线程各种属性,如线程的优先级(setPriority)、线程名(setName)和线程的类型(setDaemon)等。
注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateException异常。