`
xiaobian
  • 浏览: 580158 次
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
一、进程与线程

每一个进程都独享一块内存空间。一个应用程序可以同时启动多个进程,比如IE浏览器,打开一个IE浏览器,就相当于开启了一个进程。

线程指进程中的一个执行流程,一个进程可以包含多个线程。

每个进程都需要操作系统为其分配独立的内存地址,而同一进程中的多个线程在同一块地址空间工作,他们共享一块内存和资源。

每次调用java .exe的时候操作系统都会启动一个java 虚拟机进程,当启动java 虚拟机进程的时候,java 虚拟机都会创建一个主线程,改线程从 程序入口main方法开始执行,这个线程的名字就叫main( Thread.currentThread().getName())

java 虚拟机每启动一个线程,就给他分配一块线程方法栈,用来存放相关信息(比如局部变量等),线程就在这个栈上运行。所以java 中对象的局部变量是线程安全的,但是实力变量以及类变量由于不是保存在栈中,所以他们不是线程安全的。

二、线程的创建和启动

java 中有两中方法创建一个多线程 的类

1、继承java .lang.Thread类,覆盖Thread类的run()方法
2、实现Runnable接口,实现Runnable接口的run()方法。推荐使用第二种,因为第二种更加的灵活。

注意:每次程序运行的时候除了自定义的线程外还有一个main线程:
java 代码
  1. public class ThreadTest2 implements Runnable {

  2. /* (non-Java doc)
  3. * @see java .lang.Runnable#run()
  4. */
  5. public void run() {
  6. for ( int i= 0 ;i< 3 ;i++){
  7. System.out.println(Thread.currentThread().getName()+" " +i);
  8. }
  9. }

  10. /**
  11. * @param args
  12. */
  13. public static void main(String[] args) {
  14. Runnable r = new ThreadTest2();
  15. Thread t1 = new Thread(r, "t1" ); //创建线程t1
  16. Thread t2 = new Thread(r, "t2" ); //创建线程t2
  17. t1.start();//启动线程t1,这时候他处在Runnable状态,等待cpu
  18. t2.start();//启动线程t2,这时候他处在Runnable状态,等待cpu
  19. t1.run();//主线程main调,用对象t1的run()方法。
  20. }
  21. }

运行结果可能是:
main 0
main 1
main 2
t1 0
t1 1
t1 2
t2 0
t2 1
t2 2

三、线程的调度

线程调度的几个常用的方法,这几个方法都是Thread的静态方法:sleep();yield();join ()

sleep(xxx),指当前运行的线程睡眠xxx秒,睡眠的时候当前线程会交出cpu,以便给其他线程运行的机会,但是不会交出对象的锁!

yield(),指当前运行的线程交出cpu,给其他线程运行的机会。yield()与sleep()的区别在于:yield()只给同等级别,或者比自 己级别还高的线程运行的机会,而sleep()是给所有线程运行的机会()。貌似yield()与操作系统关系很大。

join (),指将cpu交给调用join ()方法的线程,直到他运行结束,在一定程度上可以实现synchronized类似的功能。

四、线程的各种状态

新建状态(new) //线程刚被创建出来
        Runnable r = new ThreadTest2();
        Thread t1 = new Thread(r,"t1");//创建线程t1 线程处在new状态

就绪状态(Runnable)
        t1.start();//启动线程t1,这时候他处在Runnable状态,等待cpu

运行状态(Running)
       如果处在Runnable状态的线程,被调度获得cpu,那么他就处在Running状态

阻塞状态(Blocked)
       如果Running中的线程调用sleep(),yield()等方法,他 就处在阻塞状态

死亡状态(Dead)
       线程执行完毕,就处于死亡状态。

五、线程同步

       线程同步使用synchronized关键字来惊进行。

       每一个对象都有一把锁,可以想象对象有一个等待池,一个对象锁池。
      
       因为每个对象都有一把锁,所以对同一个对象的不同方法使用synchronized,他们的锁只有一把,就是对象的本身。

       一个线程获得了对象的锁,其余的线程就得在对象锁池中等待当前线程释放对象的锁。

六、线程通讯:

       Object的两个方法;wait()和notify()实现线程之间的通讯。

       wait()使对象放弃cpu,释放对象的锁。jvm将该线程放到该对象的等待池中,等待其他线程将其唤醒
       notify()执行改方法的线程唤醒在对象的等待池中等待的一个线程,jvm从对象等待池中随机选择一个线程,把他转换到对象的锁池中

学习多线程可以看这边的文章:
http://blog.csdn.net/axman/category/64977.aspx?PageNumber=2
分享到:
评论

相关推荐

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    java多线程ppt

    java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题

    java 多线程操作数据库

    一个java 多线程操作数据库应用程序!!!

    java多线程经典案例

    java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例

    Java多线程编程技术

    《Java多线程编程核心技术》建议猿友们读两遍,因为其写得没有那么抽象,第一遍有些概念不是很理解,可以先跳过并记录起来,第一遍阅读的目的主要是了解整个架构。第二遍再慢慢品味,并贯穿全部是指点来思考,并将...

    Java多线程编程实战指南(核心篇)

    Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...

    Java多线程知识点总结

    该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!

    java多线程的讲解和实战

    详细的讲解了java多线程的原理,并配有代码进行实战,适合java初学者和想对多线程有进一步了解的人。

    java多线程通信图解

    一张图方便理解和掌握java 多线程之间通信的实质 java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,...

    java多线程处理数据库数据

    java多线程处理数据库数据,使用并发包,无框架,可批量处数据库数据,进行增删改。。等等操作。

    java多线程,对多线程,线程池进行封装,方便使用

    java多线程,对多线程,线程池进行封装,方便使用

    Java多线程编程经验

    现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。...本文档提供Java多线程编程经验,方便广大Java爱好者研究学习Java多线程

    java多线程处理大数据

    java多线程处理大数据,可根据配置的线程数,任务去调度处理

    java多线程并发

    java多线程并发的在新窗口

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...

    java多线程核心技术

    资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著 结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 Java多线程无处不在,如...

    java多线程实现大批量数据导入源码

    java多线程实现大批量数据切分成指定份数的数据,然后多线程处理入库或者导出,线程的个数和每份数据的数量都可以控制

    java多线程查询数据库

    java多线程并发查询数据库,使用线程池控制分页,并发查询。

    java多线程模拟队列实现排队叫号

    java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号 java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号

Global site tag (gtag.js) - Google Analytics