java线程

来源:互联网 发布:矩阵分解 翻译 编辑:程序博客网 时间:2024/06/05 09:14


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 blocke.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后线程会进入blockedtry {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("implements Runnable");}}}class Lion extends Thread {// 重写run方法public void run() {while (true) {// 休眠一秒,sleep后线程会进入blockedtry {sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("extends Thread!");}}}




0 0
原创粉丝点击