java线程学习详解、总结!
2017-08-12 16:03
856 查看
进程 Program:是一个指令的集合。
进程 Process:(正在执行中的程序)是一个静态的概念。1、进程是程序的一次静态执行过程,占用特定的地址空间.
2、每个进程都是独立的,由3部分组成
线程:是进程中一个单一的连续控制流程执行路径。
1、线程又被称为轻量级进程
2、一个进程可拥有多个并行的线程
3、一个进程中的线程共享相同的内存单元/内存地址空间à可以访问相同的变量和对象,而且它们从同一堆中分配对象à通信、数据交换、同步操作
4、由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快。
Java线程的实现方式:
1、继承Thread抽象类重写run方法。
2、实现Runnable接口重写run方法。
出现Runnable接口的原因:因为java是单继承多实现的,继承往往会被占用,而无法通过Thread来实现多线程,但是可以通过实现Runnable接口而达到目的。
public class ThreadDemo01 extends Thread { //重写父为的run方法 @Override public void run() { for(int i=0;i<10;i++){ System.out.println("第"+i+"次threadrun."); } } public static void main(String[] args) { //创建对象,就创建好一个线程 ThreadDemo01 d=new ThreadDemo01(); //d.run();//启动线程使用start方法 d.start(); for(int i=0;i<5;i++){ System.out.println("main-->"+i); } } }
public class RunableDemo implements Runnable { @Override public void run() { for(int i=0;i<10;i++){ System.out.println("第"+i+"次threadrun."); } } public static void main(String[] args) { //创建对象,就创建好一个线程 RunableDemo rd=new RunableDemo(); Thread t=new Thread(rd); t.start(); for(int i=0;i<5;i++){ System.out.println("main-->"+i); } } }
线程的状态:
1、新生状态:用new关键字建立一个线程后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start();方法进入就绪状态。
2、就绪状态:处于就绪状态县城就具备运行条件,但还没分到CPU,处于线程就绪队列,等待系统为其分配CPU。当系统选定一个等待的线程后,他就会从就绪队列进入到执行状态,称为“CPU调度”。
3、运行状态:在运行状态的线程执行自己的run方法中代码,直到等待某资源而阻塞或完成任何而死亡。如果在给定的时间片内没有执行结束,就会被系统给换下来回到等待执行状态。
4、阻塞状态:处于运行状态的线程在某些情况下,如执行了wait()、join()、sleep()方法进入阻塞状态。阻塞状态的线程只有等到取消后才可以重新进入就绪状态。Wait()方法必须用notify()或者notifyAll()唤醒。
5、死亡状态:死亡状态是线程生命周期中的最后一个阶段。线程死亡的原因有三个,一个是正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如通过stop方法来终止一个线程【不推荐使用】;三是线程抛出未捕获的异常。
线程同步:
1、
必须有两个或者两个以上的线程
2、
必须是多个线程使用同意资源。
3、
必须保证同步中只能有一个线程在运行。
同步监视器:
1、
synchronized(obj){}中的obj称为同步监视器
2、同步代码块中同步监视器可以是任何对象,但是推荐使用共享资源作为同步监视器
同步方法中无需指定同步监视器,因为同步方法的监视器是this,也就是该对象本
线程操作的相关方法:
RunnableDemo rd=new RunnableDemo(); Thread t=new Thread(rd);
Thread t2=new Thread(rd); t2.sleep(1000); //线程休眠5秒 t.yield(); //线程暂停 t2.start(); t.join(); //线程插队 t2.stop(); // 线程停止 t2.wait(); //线程等待(需要唤醒) t2.notify(); //唤醒当前线程 t.start(); Thread t1=Thread.currentThread(); //返回当前正在执行的线程 System.out.println(t1.getName()); //获取线程的名称 System.out.println(t.getPriority()); //返回当前线程的优先级 System.out.println(t.isAlive()); //判断线程是否在运行。
public void run() { while(true){ sale(); } } public synchronized void sale(){ //通常将当前对象作为同步对象 if (tick>0) { Thread.sleep(10); System.out.println(Thread.currentThread().getName()+"卖票:"+tick--); } }
线程通信:
wait()、noitfy()和notifyAll()组成,必须在同步方法块或者同步方法中,否则会抛出异常。
相关文章推荐
- java多线程学习总结之二:线程状态的转换
- Java学习总结之第十六章 Socket用法详解
- Java线程学习和总结
- Java线程学习总结
- Java线程学习和总结
- java多线程学习总结之四:线程的同步
- Java多线程设计模式详解学习笔记——Introduction1 Java语言的线程
- Java学习总结12——网络1(Java Socket参数详解)
- Java学习总结15——Servlet详解
- Java多线程学习总结--线程概述及创建线程的方式(1)
- Java学习之线程回顾与总结
- Java学习总结12——网络2(Java Socket选项详解)
- Java学习总结12——网络2(URLConnection详解)
- Java学习总结之线程
- java线程之基础学习总结(三)
- 《TomCat与Java Web开发技术详解》(第二版) 第六章节的学习总结 ---- JSP技术
- Java学习总结之第十六章 Socket用法详解
- Java 线程学习总结