一.什么叫线程
进程:进行中的程序;作为资源分配的单位。
线程:轻量级的进程;程序里的顺序控制流,可以理解为程序里不同的执行路径;作为调度和执行的但我i;多个线程可以共享内存,共享地址。相互间的通信十分迅速
线程体为run()方法(直接调用run()视为普通方法),启动线程为start()方法;
这里方法run()称为线程体, 它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止, 而CPU再运行其它线程, 而如果直接用Run方法, 这只是调用一个方法而已, 程序中依然只有主线程--这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
真正的多线程是指有多个CPU,而我们自己用的电脑,实际上是模拟多线程,来多个线程之间来回切换,然而由于切换的时间非常之短,所以我们所看到的就好像同时进行多个线程一样
二.如何创建线程
1.继承Thread类,重写run()方法
线程类:Rabbit(兔子)’与Tortoise(乌龟)类:
public class Rabbit extends Thread{
@Override
public void run() {
//线程体
for (int i =0; i < 100; i++){
System.out.println("兔子跑了"+i+"步");
}
}
}
/*乌龟类*/
class Tortoise extends Thread {
@Override
public void run() {
//线程体
for (int i =0; i < 100; i++){
System.out.println("乌龟跑了"+i+"步");
}
}
}
应用线程类方法:线程体是run()方法,启动线程是start()方法,直接调用run()是普通方法,并且启动线程并不等于运行了,具体还需要等待cpu调度
public class RabbitApp {
public static void main(String[] args) {
//创建子类对象
Rabbit rabbit = new Rabbit();
Tortoise tortoise = new Tortoise();
//调用start()方法,启动线程
rabbit.start();
tortoise.start();
for(int i =0; i < 10; i++){
System.out.println("main>>>>>>");
}
}
}
结果:

2.实现Runnable接口,实现run方法
优点:避免单继承;方便共享资源
实现接口的线程类
public class Programer implements Runnable{
@Override
public void run() {
for(int i = 0; i < 100; i++){
System.out.println("一边敲HelloWorld");
}
}
}
应用类:
public class ProgramerApp {
public static void main(String[] args) {
//创建真实角色
Programer p = new Programer();
//创建代理角色+持有真实角色引用
Thread proxy = new Thread(p);
//是用代理角色启动线程
proxy.start();
for (int i = 0; i < 100; i++) {
System.out.println("一边聊QQ");
}
}
}
结果:

应用:
public class Web12306 implements Runnable{
private int num = 50;
@Override
public void run() {
while (true) {
if(num < 0){
break;
}
System.out.println(Thread.currentThread().getName()+"抢到了"+num--);
}
}
public static void main(String[] args) {
//创建真实对象
Web12306 web12306 = new Web12306();
//创建代理对象
Thread t1 = new Thread(web12306,"黄牛甲");
Thread t2 = new Thread(web12306,"黄牛乙");
Thread t3 = new Thread(web12306,"黄牛丙");
//启动线程
t1.start();
t2.start();
t3.start();
}
}
结果:

3.线程的五种状态

详细状态:

创建:两种方式:1.继承Thread类,重写run()方法;2.实现Runnable接口,实现run()方法。——new出一个线程。
就绪:调用Thread的start()方法(第二种实现接口方式使用静态代理)
运行:得到时间片,开始运行
阻塞:遇到阻塞时间——解除阻塞回到就绪状态
终止:线程死亡,严禁使用stop()方法,而应该定义一个boolean flag,并在run方法中判断标志进行合理结束run()方法进而结束进程
更多线程面试知识:http://www.cnblogs.com/dolphin0520/p/3932934.html

浙公网安备 33010602011771号