相关概念:
程序:静态的概念,一组指令的集合。
进程:动态的概念,运行着的程序,是系统进行资源分配和调度的一个独立单位。
线程:动态的概念,线程是进程中的一条完整的执行的路径,线程是进程中的一条任务线。
举例:进程:火车站。进程:每一列行驶的火车都是进程。 进程:迅雷,进程:每一个下载任务都是进程。
Java提供了三种创建线程的方法:(简单示例)
继承Thread类。
package com.test.thread;
public class TestThread {
public static void main(String[] args) {
TickedThread thread1 = new TickedThread();//创建一个线程子类的线程对象
thread1.setName("线程A");//给线程起名字
thread1.start();//调用start启动线程
TickedThread thread2 = new TickedThread();//创建一个线程子类的线程对象
thread2.setName("线程B");//给线程起名字
thread2.start();//调用start启动线程
TickedThread thread3 = new TickedThread();//创建一个线程子类的线程对象
thread3.setName("线程C");//给线程起名字
thread3.start();//调用start启动线程
}
}
class TickedThread extends Thread{
//重写run方法
@Override
public void run() {
for (int i = 0 ; i < 10 ; i++) {
System.out.println(Thread.currentThread().getName()+" - - - - - "+i);
}
}
}
运行效果:
实现Runnable接口。
package com.test.thread;
/**
* 实现runnable接口创建线程对象
* @author YangLiangLiang
*
*/
public class TestRunnable {
public static void main(String[] args) {
Thread thread1 = new Thread(new TickedRunnable());
thread1.setName("runnableA");
thread1.start();
Thread thread2 = new Thread(new TickedRunnable());
thread2.setName("runnableB---");
thread2.start();
}
}
class TickedRunnable implements Runnable{
@Override
public void run() {
for (int i = 0 ; i < 10 ; i++) {
System.out.println(Thread.currentThread().getName()+" - - - - - "+i);
}
}
}
运行效果:
实现Callable接口。(jdk1.5)
因为java有单继承的局限性,所以少用thread,多用runnable。
一个线程的生命周期:(图示)
线程常用方法:
(详情请查看对应版本API)
售票窗口---线程同步:(简单小栗子,无伪代码QAQ)
同步代码块:
package com.test.thread;
public class TestTicketThread {
public static void main(String[] args) {
Ticket ticket = new Ticket();
TicketSaler ts1 = new TicketSaler(ticket);
ts1.setName("窗口A");
TicketSaler ts2 = new TicketSaler(ticket);
ts2.setName("窗口B");
TicketSaler ts3 = new TicketSaler(ticket);
ts3.setName("窗口C");
TicketSaler ts4 = new TicketSaler(ticket);
ts4.setName("窗口D");
ts1.start();
ts2.start();
ts3.start();
ts4.start();
}
}
class Ticket{
private int count = 10;
public boolean sell(int count){
synchronized (Ticket.class) {
if (this.count>=count) {
this.count-=count;
System.out.println(Thread.currentThread().getName()+"卖出了"+count+"张票!余票"+this.count);
return true;
}
System.out.println(Thread.currentThread().getName()+"出票失败!余票不足张票!余票"+this.count);
return false;
}
}
}
class TicketSaler extends Thread{
private Ticket ticket;
public TicketSaler(Ticket ticket) {
super();
this.ticket = ticket;
}
@Override
public void run() {
boolean result = ticket.sell(1);
while (result) {
result = ticket.sell(1);
}
}
}
同步方法:(emmm····)
class Ticket {
private int count = 10;
public synchronized boolean sell(int count) {
if (this.count >= count) {
this.count -= count;
System.out.println(Thread.currentThread().getName() + "卖出了" + count + "张票!余票" + this.count);
return true;
}
System.out.println(Thread.currentThread().getName() + "出票失败!余票不足张票!余票" + this.count);
return false;
}
}