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!");}}}
- Java线程:什么是线程
- Java线程:线程池
- java线程--线程退出
- JAVA-线程/线程锁
- Java线程:什么是线程
- Java线程:线程中断
- Java线程:线程状态
- Java线程: 线程调度
- Java线程:线程交互
- java--线程--线程池
- java 线程
- Java线程
- java线程
- java线程
- Java线程
- Java线程
- java线程
- JAVA 线程
- 操作系统:银行家算法(避免死锁)
- 安装.net framework 3.5出错 提示0x800f081f问题!
- maven阿里云中央仓库
- jdk安装注意事项
- Fast Walsh-Hadamard Transform (快速沃尔什变换)
- java线程
- AsyncTask用法总结(Android)
- 【EXPLAIN】“type”字段详解之MySQL官方文档翻译
- Android 项目目录结构
- java中不利用get方法获得私有属性、不利用set方法修改私有属性、通过执行私有方法getName获得私有属性、通过执行私有方法setName更改私有属性name的值
- 使用百度的Echart遇到的问题
- osgi
- C++11特性初探
- Maven:灵活构建