`
baoxiaofei
  • 浏览: 32966 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

线程学习,转来看看

 
阅读更多
转帖:
http://developer.51cto.com/art/200906/128232.htm
讲得不错,正适合现在的运用,谢谢作者!

一 线程的基本概念

线程是一个程序内部的顺序控制流.一个进程相当于一个任务,一个线程相当于一个任务中的一条执行路径.;多进程:在操作系统中能同时运行多个任务(程序);多线程:在同一个应用程序中有多个顺序流同时执行;Java的线程是通过java.lang.Thread类来实现的;JVM启动时会有一个由主方法(public static void main(){})所定义的线程;可以通过创建Thread的实例来创建新的线程;每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体,通过调用Thread类的start()方法来启动一个线程。

二 线程的创建和启动

可以有两种方式创建新的线程:
第一种:
1.定义线程类实现Runnable接口
2.Thread myThread = new Thread(target);   //target为Runnable接口类型
3.Runnable中只有一个方法:public void run();用以定义线程运行体
4.使用Runnable接口可以为多个线程提供共享的数据
5.在实现Runnable接口的类的run()方法定义中可以使用Thread的静态方法public static Thread currentThread();获取当前线程的引用

第二种:
1.可以定义一个Thread的子类并重写其run方法如:
class MyThread extends Thread {   
public void run() {...}

}   
2.然后生成该类的对象:
MyThread myThread = new MyThread();

三 线程控制的基本方法

isAlive():判断线程是否还"活"着
getPriority():获得线程的优先级数值
setPriority():设置线程的优先级数值
Thread.sleep():将当前线程睡眠指定毫秒数
join():调用某线程的该方法,将当前线程与该线程"合并",即等待该线程结束,再恢复当前线程的运行
yield():让出cpu,当前线程进入就绪队列等待调度
wait():当前线程进入对象的wait pool
notify()/notifyAll():唤醒对象的wait pool中的一个/所有等待线程

四 线程同步

实现生产者消费者问题来说明线程问题,举例如下所示:


/**  
* 生产者消费者问题  
*/ 
package com.basic.thread;  

/**  
* @author johnston678  
*  
* @version 2009-05-06  
*/ 
public class ProducerConsumer {  

     /**  
      * @param args  
      */ 
     public static void main(String[] args) {          
         ProductBox pb = new ProductBox();  
         Producer p = new Producer(pb);  
         Consumer c = new Consumer(pb);  
          
         Thread pThread = new Thread(p);  
         Thread cThread = new Thread(c);  
         pThread.setPriority(Thread.MAX_PRIORITY);  
          
         pThread.start();  
         cThread.start();  
     }  

}  

/**  
* 产品对象  
* @author johsnton678  
*/ 
class Product {  
     int id;  

     public Product(int id) {  
         super();  
         this.id = id;  
     }  
      
     public String toString(){  
         return "Product:" + id;  
     }  
}  

/**  
* 产品盒对象  
* @author johnston678  
*/ 
class ProductBox {  

     Product[] productbox = new Product[6];  
     int index = 0;  
     public ProductBox() {  
         super();          
     }  
      
     public synchronized void push(Product p) {  
         while (index == productbox.length) {  
             try {  
                 this.wait();  
             } catch (InterruptedException e) {  
                 // TODO Auto-generated catch block  
                 e.printStackTrace();  
             }  
         }  
         this.notify();          
         productbox[index] = p;  
         index ++;  
     }  
      
     public synchronized Product pop() {  
         while (index == 0) {  
             try {  
                 this.wait();  
             } catch (InterruptedException e) {  
                 // TODO Auto-generated catch block  
                 e.printStackTrace();  
             }  
         }  
         this.notify();  
         index --;  
         return productbox[index];  
          
     }  
}  

/**  
* 生产者  
* @author johnston678  
*/ 
class Producer implements Runnable {  

     ProductBox productbox = null;  
      
     public Producer(ProductBox productbox) {  
         super();  
         this.productbox = productbox;  
     }  

     @Override 
     public void run() {  
         // TODO Auto-generated method stub  
         for (int i=0; i<10; i++) {  
             Product p = new Product(i);  
             productbox.push(p);  
             System.out.println("produce:" + p);  
              
             try {  
                 Thread.sleep((int)(Math.random() * 200));  
             } catch (InterruptedException e) {  
                 e.printStackTrace();  
             }  
         }  
     }  
      
}  

/**  
* 消费者  
* @author johnston678  
*/ 
class Consumer implements Runnable {  

     ProductBox productbox = null;  
      
     public Consumer(ProductBox productbox) {  
         super();  
         this.productbox = productbox;  
     }  

     @Override 
     public void run() {  
         // TODO Auto-generated method stub  
         for (int i=0; i<10; i++) {  
             Product p = productbox.pop();  
             System.out.println("consume:" + p);  
              
             try {  
                 Thread.sleep((int)(Math.random() * 1000));  
             } catch (InterruptedException e) {  
                 e.printStackTrace();  
             }  
         }  
     }  
      
}
分享到:
评论

相关推荐

    corejava多线程学习总结.pdf

    ### CoreJava多线程学习总结 #### 一、基本概念 多线程是现代软件开发中非常重要的一个概念,尤其在Java这样的高级编程语言中,它使得程序能够更高效地利用计算机资源,实现并发处理任务。为了更好地理解CoreJava...

    多线程学习必看几点

    ### 多线程学习必看知识点 #### 一、引言与问题提出 在软件开发领域,特别是对于那些需要处理大量数据或者长时间运行的任务时,单线程的应用程序往往会出现性能瓶颈,导致用户体验下降。例如,在一个单线程程序中...

    java多线程学习-ftp上传

    总结来说,Java多线程学习和FTP上传结合,可以帮助我们构建高效、可控的文件上传服务。通过线程池,我们可以更好地管理并发任务,优化资源使用,提高FTP上传的性能。学习这些内容对于Java开发者尤其重要,尤其是在...

    jsp 多线程学习有关源码

    jsp多线程学习教程源码,有兴趣的看看啊,不足的地方还见谅啊

    多线程学习教程

    学习多线程编程时,不仅要掌握理论知识,还需要通过实践来理解和解决问题,例如通过编写多线程程序来模拟生产者消费者问题、哲学家就餐问题等经典并发问题。提供的压缩包"Multi-thread Program Tutorials"可能包含了...

    Java Socket学习---单线程阻塞

    但是,对于初学者来说,理解单线程阻塞模型是学习网络编程的基础,有助于深入理解Socket通信的工作原理。 此外,源码分析可以帮助我们更好地理解Socket通信的细节,例如异常处理、连接超时、资源管理等。通过阅读和...

    python线程教程,python线程学习笔记.doc

    首先,让我们看看线程如何访问全局变量。在Python中,一个进程内的所有线程共享全局变量。例如,在提供的代码段中,`g_num`就是一个全局变量,`test`函数通过`global`关键字声明并访问它。当两个或更多线程同时修改...

    .net线程学习代码

    本项目以".NET线程学习代码"为主题,旨在帮助开发者理解和掌握.NET环境下的多线程编程技术。下面将详细探讨相关知识点。 首先,线程在.NET中的创建有两种主要方式:通过`System.Threading.Thread`类的实例化或使用`...

    Nachos设置线程id和限制线程数

    首先,我们来看`thread.h`文件。这个头文件通常包含了线程类的定义,以及与线程相关的常量、结构体和函数声明。在Nachos中,线程ID可能是用整数或者自定义的数据结构来表示的。线程ID用于唯一标识系统中的每个线程,...

    易语言多线程模块

    首先,我们来看多线程的基本概念。线程是操作系统分配处理器时间的基本单位,一个进程可以包含一个或多个线程。在单线程环境下,程序按照顺序执行;而在多线程环境下,多个线程可以并发执行,使得程序能够并行处理多...

    .NET多线程实例

    首先,我们来看"控制台和WinForm的并行访问"。在.NET 2.0中,你可以使用System.Threading命名空间下的Thread类来创建和管理线程。在控制台应用中,多线程可以用于执行耗时的任务,而不阻塞主线程。而在WinForm应用中...

    C# 打字游戏(学习多线程必看)

    总的来说,“C#打字游戏”项目提供了一个很好的学习多线程编程的机会。通过分析和实现这个游戏,开发者不仅能掌握如何创建和管理线程,还能理解如何在多线程环境中处理数据同步、异常和资源管理。这是一个实用且有趣...

    Java多线程示例之线程控制

    首先,我们来看自定义线程池方法实现线程数控制的例子。线程池(ThreadPool)是Java并发编程中非常重要的概念,它能有效地管理和调度线程,避免过多线程导致的系统资源消耗。在`MaxThreadCountTest`中,开发者可能...

    线程资料很不错的 看看咯

    在IT行业中,线程是操作系统分配处理器时间的基本单位,它允许程序并发地执行多个任务。在单线程和多线程服务端应用系统中,...通过深入学习和实践,我们可以更好地利用线程这一工具,构建出高效、稳定的服务器应用。

    vc多线程-mfc-大家可以看看

    本文将深入探讨MFC如何支持多线程,并基于标题"vc多线程-mfc-大家可以看看"及描述"vc多线程-mfc-大家可以看看这是第二部分"来阐述相关知识点。 首先,理解多线程的概念是至关重要的。多线程是指在一个进程中...

    mfc实现多线程工程代码和线程进程查看软件

    现在,我们来看如何实现一个线程查看软件。`processthreadsview_veryhuo` 文件可能是一个线程查看器的应用程序示例。线程查看器可以帮助开发者监控应用程序中的线程,观察它们的状态(如运行、等待、挂起等),以及...

    MFC线程间通信

    在压缩包文件"MultThread"中,可能包含了实现上述线程间通信方式的示例代码和教程,通过学习和实践,你可以更深入地理解MFC线程间通信的原理和应用。建议逐步分析和运行这些示例,以巩固理论知识并提升实际操作技能...

    ThreadSwitch_滴水_threadswitch_线程切换_

    从提供的文件列表来看,“ThreadSwitch”可能是示例项目的名称,而“ThreadSwitch.sln”是Visual Studio的解决方案文件,包含项目配置和依赖项信息。通过分析这个项目,我们可以更深入地了解线程切换的实际应用和...

Global site tag (gtag.js) - Google Analytics