java线程学习
来源:互联网 发布:论坛群发软件 编辑:程序博客网 时间:2024/05/17 05:03
- 线程是程序中的一条执行路径,即程序的运行流程。
- 多线程即程序中包含多条执行路径,指一个程序中可以同时运行多个程序块。多线程编程就是将程序任务分成几个并行的小任务,多个线程可以共享一块内存区域和资源。
- 线程的5个基本状态:创建状态;就绪状态;运行状态;阻塞状态;终止状态。
- 创建状态: 用new运算符创建Thread或者其子类的实例化对象,新线程即处于创建状态。例如: new Thread(子类对象名).start(); new Thread(子类对象名).start(); 就创建了两个线程。
- 就绪状态:调用start()方法,具有运行条件。即为线程分配系统资源,线程启动并进入就绪状态,进入线程队列排队,等待cpu服务,一旦获得CPU等资源,就可以脱离其主线程独立运行。
- 运行状态:run();
- 阻塞状态: 以下4种情况都是线程会进入阻塞状态。 阻塞时,线程不能进入排队队列,只有消除阻塞后才可以转入到就绪状态。
- 调用sleep();
- wait();
- suspend();
- 该线程正在等待I/O操作。
- 终止状态:stop(),destroy()方法。
- 创建线程的两种方式:
- 继承Thread类。
public class 类名称 extends Thread{//从Thread类扩展出子类public 类名称(){//子类的构造方法}public void run(){//重写Thread类里的run()方法。}public static void mian(String args[]){子类类名称 对象名=new 子类类名称();子类的对象.start();}}
- 实现Runnable接口。
//实现Runnabel接口创建线程的方式class ManyThread implements Runnable {//属性//方法public ManyThread(){//构造方法}public void run(){//线程的功能代码}public static void main(String[] args) {ManyThread rs=new ManyThread();Thread t=new Thread(rs);t.start();}}
当Java想要继承某个类的同时创建多线程的时候,就需要用Runable接口创建线程了。
- 进程与线程:进程:一个任务就是一个进程。操作系统中,进程被看做是系统资源的分配单位和独立运行的基本单位。一个进程中可以存在一个或者多个线程。 两者的区别在以下两个方面:
- 同样作为基本的执行单元,线程是比进程更小的执行单位。
- 每个进程都有一段专用的内存区域。一个进程崩溃后,在保护模式下不会对其它进程产生影响,线程是进程内部单一的一个顺序流。与此相反,线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,线程共享内存单元(包括代码和数据),通过共享的内存单元来实现数据交换、实时通信与不必要的同步操作。
- 多线程同步代码块 同步是是各线程之间协调使用共享资源的以中共方式,如果一个对象(或者变量)同时被多个线程访问,那么这个对象必须使用线程同步。线程同步分同步代码块和同步方法两种。 同步代码块格式:
synchronized(syncObject){ /**需要同步的代码;*/}
同步代码块-例子:public class test {public static void main(String[] args) {//TextThread为实现Runnable接口的类,该类里有重写的run()方法。TextThread t=new TextThread();//开启了两个线程,new Thread(t).start();new Thread(t).start();}}class TextThread implements Runnable{private int num=3;public void run(){while(true){//由于两个线程访问的是同一个对象t,因此这个对象要线程同步,此处是线程同步代码块。synchronized (this){if(num>0){try{Thread.sleep(100);//线程休眠}catch(InterruptedException e){System.out.println(Thread.currentThread().getName()+"出错了!");}System.out.println(Thread.currentThread().getName()+"数字为:"+num--);}else {System.out.println(Thread.currentThread().getName()+"退出了");break;//如果num<0就退出循环。}}}}}
上例,Thread-0执行结束后,Thread-1才可以访问同步代码块。 多线程同步方法:当一个方法被关键字synchrozied声明后,就只允许一个线程来操作这个方法。即一次只能让一个线程运行。 格式如下:访问控制符 synchonized 返回值类型 方法名称(参数){ /**方法体*/}
多线程同步方法例子:public class ThreadDemo {public static void main(String[] args) {ThreadTest1 t=new ThreadTest1();new Thread(t).start();new Thread(t).start();System.out.println(t.call());}}class ThreadTest1 implements Runnable{private int x;private int y;public synchronized void run(){for (int i=0;i<4;i++){x++;y++;try{Thread.sleep(100);}catch(InterruptedException e){System.out.println("The thread is wrong!");}System.out.println(Thread.currentThread().getName()+""+"x="+x+""+"y="+y+""+i);}}public synchronized String call(){String name=Thread.currentThread().getName();return "Hello"+name;}}
运行结果:等应该共6种情况,可以看出每次只执行一个线程,且必须等这个线程结束才执行下一个线程。 - wait()和notify()
- wait():使线程处于等待状态,并且释放所持有对象的锁,要与notify()配套使用。每个java对象都有一个锁,任何时候该锁只能由一个线程控制。当wait()方法释放了该对象的锁时,进入等待池,一直要到线程调用该对象的notify()和notifyAll()方法,线程才可以进入可执行状态。
- 唤醒一个等待状态的线程,是由JVM确定唤醒哪个(而非按优先级),自己并不能确切的唤醒某一个等待状态的线程。
- notifyAll():唤醒所有处于等待的线程,而非给所有唤醒线程一个对象的锁,是让他们竞争,获得锁的线程即进入可执行状态。
- java学习日记(线程)
- Java线程学习
- java线程学习基础
- java线程学习总结
- JAVA学习【知】线程
- Java学习之多线程
- java线程初步学习
- Java线程学习11.30
- java线程学习例子
- 关于java 线程学习
- java线程学习总结
- Java 线程池学习
- java线程的学习
- java线程的学习
- java线程池学习
- Java 线程池学习
- java线程学习
- java线程学习
- adroid用户界面设计原则
- 主成分分析(Principal components analysis)-最小平方误差解释
- 天地图2.0和google卫星非偏移数据叠加
- Cocos2d-x游戏开发之一 CCProgressTimer 生命条实现
- PLSQL登录时 无法解析指定的连接标识符
- java线程学习
- JAVA中常见的Exception(面试中经常考)
- java种异常机制和事件委托机制
- BOOST timer库应用[timer库1] [大三四八九月实习]
- jsp页面跳转中,从js里面获取url中的参数
- Statistical Formulas For Programmers
- Java菜鸟学习笔记--数组篇(三):二维数组
- linux mysql 免安装版
- poj 1659 Frogs' Neighborhood havel定理