一、线程的概念
线程是进程的一个实体,是CPU调度和分派的基本单位
线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈,线程切换比进程切换开销小
多进程:在操作系统中能同时运行多个程序
多线程:在同一程序中多个顺序刘同时执行
二、现成的五种状态
创建状态,就绪状态 ,运行状态,阻塞状态,死亡状态
在JAVA里面,JAVA的线程是通过java.lang.Thread类来实现的,每一个Thread对象代表一个新的线程。创建一个新线程出来有两种方法:第一个是从Thread类继承,另一个是实现接口runnable。VM启动时会有一个由主方法(public static void main())所定义的线程,这个线程叫主线程。可以通过创建Thread的实例来创建新的线程。你只要new一个Thread对象,一个新的线程也就出现了。每个线程都是通过某个特定的Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。
public class MyThread extends Thread {
@Override
public void run() {
//线程所要之星的代码
for(int i = 1 ; i<=10;i++) {
if(i%3==3) {
//让线程休眠
try {
this.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
System.out.println(this.getName()+"--"+i);
}
}
}
}
测试
public class Test {
public static void main(String[] args) {
//创建线程
MyThread thread1 = new MyThread();
//给线程起名
thread1.setName("线程1");
MyThread thread2 = new MyThread();
thread2.setName("线程2");
//设置线程级别
thread1.setPriority(10);
//启动子线程
thread1.start(); //就绪状态 (可运行状态)
thread2.start(); //就绪状态(可运行状态)
//线程礼让yield:只礼让同级别的线程,自己也被礼让
thread2.yield();
try {
//线程加入join:谁加入谁运行
thread1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
实现Runnable创建
public class MyRunnable implements Runnable {
// 声明火车票数量
public static int count = 10;
private String name; // 线程名称
public void setName(String name) {
this.name = name;
}
@Override
public void run() {
while (count > 0) {
buy();
}
}
// 创建买票方法
public synchronized void buy() {
count--;
System.out.println(name + "买到了第" + (10 - count) + "张票,还剩" + count + "张票");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
测试
public static void main(String[] args) {
//创建线程
MyRunnable runnble1 = new MyRunnable();
runnble1.setName("张三");
MyRunnable runnble2 = new MyRunnable();
runnble2.setName("李四");
System.out.println("开始买票了");
Thread t1 = new Thread(runnble1);
Thread t2 = new Thread(runnble2);
t1.start();
t2.start();
}
Runnable和Thread都可以实现run方法,但一个是接口,一个是类,前者可以无限地创建Thread进行run,而后者进行一次run之后就无法再次run,所以推荐使用实现Runnable的方法创建线程
线程状态转换