1.什么是线程
* 线程是程序执行的一条路径, 一个进程中可以包含多条线程.
*多线程并发执行可以提高程序的效率, 可以同时完成多项工作.2.什么是多线程(多线程并行和并发的区别)
* 并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。(需要多核CPU)
* 并发是指两个任务都请求运行,而处理器只能按受一个任务,就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行。
3.多线程的实现方式多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程
通过查看源码,thread实现了runnable接口
①.继承Thread
package it.thread;
public class Test1 extends Thread {
/**
* 手动重写run方法
*/
public void run() {
//super.run();
for (int i = 0; i <1000; i++) {
System.out.println("aaaaa");
}
}
//结果是aaaabbbb会交替输出
public static void main(String[] args) {
Test1 test1 = new Test1();
//开启线程,调用run方法
test1.start();
for (int i = 0; i < 1000; i++) {
System.out.println("bbbb");
}
}
}
②实现Runnable
package it.runnable;
public class MyRunnable implements Runnable{
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("bbbb");
}
}
//结果也是aaabbb乱序交替输出。
public static void main(String[] args) {
//接口的子类thread开启线程
Thread thread = new Thread(new MyRunnable());
thread.start();
for (int i = 0; i < 1000; i++) {
System.out.println("aaaa");
}
}
}
当然我们也可以使用匿名内部类来开启多条线程.
1.package it.thread;
2.
3.public class Demo4_Thread {
4.
5. /**
6. * @param args
7. */
8. public static void main(String[] args) {
9. //继承Thread类
10. new Thread() { //1,继承Thread类
11. public void run() { //2,重写run方法
12. for(int i = 0; i < 1000; i++) { //3,将要执行的代码写在run方法中
13. System.out.println("aaaaaaaaaaaaaa");
14. }
15. }
16. }.start(); //4,开启线程
17. //实现Runnable接口
18. new Thread(new Runnable() { //1,将Runnable的子类对象传递给Thread的构造方法
19. public void run() { //2,重写run方法
20. for(int i = 0; i < 1000; i++) { //3,将要执行的代码写在run方法中
21. System.out.println("bb");
22. }
23. }
24. }).start(); //4,开启线程
25. }
26.
27.}
4.两种方法的比较
* 继承Thread
好处是:可以直接使用Thread类中的方法,代码简单
弊端是:如果已经有了父类,就不能用这种方法
* 实现Runnable接口
好处是:即使自己定义的线程类有了父类也没关系,因为有了父类也可以实现接口,而且接口是可以多实现的
弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂
5.常用方法
Thread.sleep(毫秒) :休眠当前线程
Thread.get/setName(String) :获取/设置当前线程的名字
Thread.setDaemon(boolean b), 设置一个线程为守护线程, 该线程不会单独执行, 当其他非守护线程都执行结束后, 自动退出
Thread.setPriority(int i):i的取值范围为1到10,数值越大,优先级越高
Thread.yield():礼让线程,让出cpu
6.火车站售票经典实例模仿
package it.runnable;
//火车站售票
public class Test4 {
public static void main(String[] args) {
Ticket t = new Ticket();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class Ticket implements Runnable{
private int tk = 100;
public void run() {
while(true){
synchronized (Ticket.class) {
if (tk<=0) {
break;
}
try {
//睡0.1秒
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "...这是第" + tk-- + "号票");
}
}
}
}
6.线程安全就是在源码中加入了synchronized锁.
可以查看其源码如: Vector是线程安全的,ArrayList是线程不安全的
StringBuffer是线程安全的,StringBuilder是线程不安全的
Hashtable是线程安全的,HashMap是线程不安全的
未完待续
最后,这里有一些关于线程问题和解答,大家可以去看一下:http://blog.jobbole.com/76308/