1、概念
一、什么是进程?
进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间),比如用户点击桌面的ie浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间。当用户再次点击桌面的ie浏览器,又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。
二、什么是线程?
1、线程是轻量级的进程
2、线程是没有独立的地址空间(内存空间)
3、线程是由进程创建的(寄生在进程)
4、一个进程可以拥有多个线程(这就是我们常说的多线程编程)
5、线程有几种状态:新建状态(new)、就绪状态(runnable)、运行状态(running)、阻塞状态(blocked)、死亡状态(dead)
线程状态示意图:
三、在java中一个类要当作线程来使用有两种方法:
1、继承Thread类,并重写run函数
2、实现Runnable接口,并重写run函数
注意:不管是通过继承Thread,还是通过实现Runnable接口创建线程,它们的一个对象只能启动(既:start())一次,否则就会有异常抛出。
四、java线程的同步
在售票程序中同一张票可能被多个售票窗口出售的情况!
示例代码如下:
if(nums>0){
System.out.println("销售第"+nums+"张票"); //语句1
nums--; //语句2
}
假如:现在i=1,a线程刚刚执行完语句1正要执行语句2时,b线程执行if(nums>0)因为这时nums还是1,所以b线程将执行语句1,这样
就相当于1号票被卖出了两次,这样多并发就给我们带来了麻烦。
解决方案:
synchronized(Object){
//你要同步的代码
}
通俗解释:就好像有人在上厕所时先把门关上(上锁),其他的人先排队(在线程池),等上厕所的人完成后再把门打开(解锁),这时排队的人再依次去上厕所。
2、示例代码
package com.llb.jichu;
public class MyThread {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// Lion lion = new Lion();
// 启动线程
// lion.start();
// Tiger tiger = new Tiger();
// Thread thread = new Thread(tiger);
// thread.start();
TicketWindow tw = new TicketWindow();
Thread t1 = new Thread(tw);
Thread t2 = new Thread(tw);
Thread t3 = new Thread(tw);
t1.start();
t2.start();
t3.start();
}
}
class TicketWindow implements Runnable {
private int nums = 100;
public void run() {
while (true) {
synchronized (this) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (nums > 0) {
System.out.println(Thread.currentThread().getName() + "售出第"
+ nums + "张票...");
nums--;
} else {
System.out.println("票已售完,敬请关注!");
break;
}
}
}
}
}
class Tiger implements Runnable {
// 重写run方法
public void run() {
while (true) {
// 休眠一秒,sleep后线程会进入blocked
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("implements Runnable");
}
}
}
class Lion extends Thread {
// 重写run方法
public void run() {
while (true) {
// 休眠一秒,sleep后线程会进入blocked
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("extends Thread!");
}
}
}