一、操作系统级别的进程与线程
1.进程:

  一个计算机程序的运行实例。包含了需要执行的指令,有自己的独立地址空间,是互相隔离的。进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。
2.线程:

  表示程序的执行流程,是CPU调度执行的基本单位。线程有自己的程序计数器、相同的地址空间、同时共享进程所拥有的内存和其他资源。
二、Java中的并发编程简介
1.并发编程的优点:

  并发编程可以使程序执行速度得到极大提高,或者为设计某些类型的程序提供更易用的模型。
2.Java中并发的常用之处:

  Web应用是最常见的Java系统之一,而基本的Web库类、Servlet具有天生的多线程性。此外,图形化用户界面Swing和SWT类库都拥有针对线程安全的机制,要熟练的掌握仍然需要理解并发。
3.Java线程机制简介:

  Java线程机制是抢占式(非协作式)的,这意味着调度机制会周期性地中断线程,将上下文切换到另一个线程。
三、Java中的简单线程编程实现
1.java中实现最简单的线程编程
(1)定义任务
  要想定义任务,则需要实现Runnable接口并编写run( )方法,使得该任务可以执行自己的想法。

 /**
* @author Jayden Ransom
* mainTask类实现Runnable接口定义一个任务,testMain在主线程中启动该任务。
*
* */
class MainTask implements Runnable {
private int numIncrease = 1;
private static int taskIncrease = 1;
private final int taskId = taskIncrease++;
public String toString() {
return "这是第" + taskId + "个正在执行的任务的第" + numIncrease + "次执行";
}
//创建任务,必须编写run方法,这将被调用从而启动任务
public void run() {
while(numIncrease <= 10) {
System.out.println( toString() );
numIncrease++; }
}
}

注: (1)要想从Runnable导出一个类,则这个类必须有run( )方法。
             (2)实现Runnable接口只是定义一个任务,该类并没有任何内在的线程能力。
下面的实例中,我们在主方法中实例化MainTask类来在主线程(分配给main的那个线程)中调用此任务。

 //在TestMain的主方法中,通过创建MainTask类的对象在主线程中调用此任务
public class TestMain {
public static void main(String args[]) {
MainTask mainTask = new MainTask();
mainTask.run();
}
}
/*Sample Output:
这是第1个正在执行的任务的第1次执行
这是第1个正在执行的任务的第2次执行
这是第1个正在执行的任务的第3次执行
这是第1个正在执行的任务的第4次执行
这是第1个正在执行的任务的第5次执行
这是第1个正在执行的任务的第6次执行
这是第1个正在执行的任务的第7次执行
这是第1个正在执行的任务的第8次执行
这是第1个正在执行的任务的第9次执行
这是第1个正在执行的任务的第10次执行
*/

(2)驱动任务
  经过上面(1)的了解,相信大家已经对于如何在java中创建任务有了了解。但是单单定义任务并不能满足我们的需要。我们的目的是将定义的Runnable对象转变为工作任务。
  要想驱动任务,则需要将这个Runnable对象提交给一个Thread构造器。

Thread类的最基本方法:
        1)Thread.start( )方法:该方法为该线程(即将执行构造器中的任务的线程)执行必
            需的初始化操作,然后调用Runnable的run( )方法,从而在这个新线程中启动
            该任务。
        2)Thread.sleep( int )方法:该方法的参数为以毫秒(ms)为单位,意在中止当前线
            程执行的任务指定的时间。
            但是该写法已经过时,目前Java SE(5/6及以上)新写法为
            TimeUnit.MILLISECONDS.sleep( int )
        3)Thread.yield( )方法:该方法的调用是对线程调度器的一种建议。这一方法的调用意在声明该进程中正在执行的任务已经完成了生命周期中最重要的部分了,此刻将时间片分给其他任务使用会造成比较小的额外开销。

  有关于更多关于Thread类的方法的在后续文章中会逐步介绍。

下面这个例子展示了如何通过Thread类来驱动任务

 /**
* @author Jayden Ransom
* 将定义好的任务交给Thread构造器,利用Thread驱动任务。
* 这里中的MainTask类已经在上面的代码中定义,故此处不再重复定义
* */ public class ThreadTest {
public static void main(String args[]) {
Thread testThread = new Thread(new MainTask());
testThread.start();
System.out.println("任务已初始化完毕");
}
}
/*Sample Output:
所有任务已经准备就绪
这是第1个正在执行的任务的第1次执行
这是第1个正在执行的任务的第2次执行
这是第1个正在执行的任务的第3次执行
这是第1个正在执行的任务的第4次执行
这是第1个正在执行的任务的第5次执行
这是第1个正在执行的任务的第6次执行
这是第1个正在执行的任务的第7次执行
这是第1个正在执行的任务的第8次执行
这是第1个正在执行的任务的第9次执行
这是第1个正在执行的任务的第10次执行
*/

下面这个例子显示了如何创建多个线程,同时驱动多个任务(由于输出过多,样例输出省略了一部分)

 /**
* @author Jayden Ransom
* 将定义好的任务交给多个Thread构造器,利用Thread驱动多个任务。
*
* */ public class MoreThreadTest {
public static void main(String args[]) {
for (int i = 0; i < 5; i++) {
new Thread(new MainTask()).start();
}
}
}
/*Sample Output:
这是第2个正在执行的任务的第1次执行
这是第5个正在执行的任务的第1次执行
.
.
.
这是第1个正在执行的任务的第2次执行
这是第1个正在执行的任务的第3次执行
这是第1个正在执行的任务的第4次执行
这是第1个正在执行的任务的第5次执行
.
.
这是第5个正在执行的任务的第5次执行
.
.
这是第5个正在执行的任务的第9次执行
这是第5个正在执行的任务的第10次执行
.
.
.
这是第2个正在执行的任务的第9次执行
这是第4个正在执行的任务的第6次执行
这是第4个正在执行的任务的第7次执行
.
.
这是第3个正在执行的任务的第9次执行
这是第3个正在执行的任务的第10次执行
这是第1个正在执行的任务的第10次执行
这是第4个正在执行的任务的第10次执行
这是第2个正在执行的任务的第10次执行 */

2.管理多个Thread
  之前我们接触的例子都是只有一个任务,并由一个Thread对象驱动的简单例子。但往往在我们的实际编程中,会有好多时候需要多个Thread对象驱动任务,这里我们引进Java SE5的java.util.concurrent包中的Executor(执行器)类。Executor类将为我们管理Thread对象,从而简化并发编程。
下面是一个简单的使用Executor的例子:

 /**
* @author Jayden Ransom
* 使用Executor的例子
* */ public class ExecutorTest {
public static void main(String args[]) {
//使用静态方法创建Executor对象
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
exec.execute(new MainTask() ); }
//这里对shutdown()方法的调用是防止新的任务添加到这个Executor
exec.shutdown();
}
}
/*Sample Output:
这是第2个正在执行的任务的第1次执行
这是第1个正在执行的任务的第1次执行
这是第1个正在执行的任务的第2次执行
这是第1个正在执行的任务的第3次执行
...
这是第2个正在执行的任务的第10次执行
这是第4个正在执行的任务的第7次执行
这是第4个正在执行的任务的第8次执行
...
这是第3个正在执行的任务的第9次执行
这是第4个正在执行的任务的第9次执行
这是第4个正在执行的任务的第10次执行
这是第3个正在执行的任务的第10次执行 */

注:1)在例子中我们创建的是一个ExecutorService对象,该对象是使用静态的Executor方法创建的。
    在这里同样你可能还注意到了我们在初始化Executor对象的时候用的方法是Executors类的 newCachedThreadPool( )方法,这里我们同样还可以调用其他的方法    对ExecutorService对象进行初始化,例如newFixedThreadPool( )方法。

    二者区别:CachedThreadPool将为每个任务都创建一个线程。而利用FixedThreadPool,可以一次性预先执行代价高昂的线程分配,因而也就可以限制线程的数          量了(相比CachedThreadPool,可以节省每次创建线程的开销)。
  2)ExecutorService对象是使用静态的Executor方法创建的,这个方法可以确定其Executor类型

四、总结

  有了以上的理解,应该对基本的任务以及线程的概念有了一些基本概念。但这仅仅是一个开始,在下一篇博文中,将继续介绍有关线程的知识(重点是对线程的异常问题及共享受限资源的解释)。

  参考书籍:《Java编程思想》
      

Java多线程线程学习(一)的更多相关文章

  1. Java多线程技术学习笔记(二)

    目录: 线程间的通信示例 等待唤醒机制 等待唤醒机制的优化 线程间通信经典问题:多生产者多消费者问题 多生产多消费问题的解决 JDK1.5之后的新加锁方式 多生产多消费问题的新解决办法 sleep和w ...

  2. java多线程入门学习(一)

    java多线程入门学习(一) 一.java多线程之前 进程:每一个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销.一个进程包括1--n个线程.     线程:同一类线程共享代码 ...

  3. Java多线程——线程的创建方式

    Java多线程——线程的创建方式 摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态. 部分内容来自以下博客: https://www.cnblogs.com/dolph ...

  4. Java多线程——线程之间的协作

    Java多线程——线程之间的协作 摘要:本文主要学习多线程之间是如何协作的,以及如何使用wait()方法与notify()/notifyAll()方法. 部分内容来自以下博客: https://www ...

  5. Java多线程——线程之间的同步

    Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,如何使用volatile关键字,如何使用synchronized修饰的同步代码块和同步方法解决线程安全问题. 部分内容来自以 ...

  6. Java多线程——线程八锁案例分析

    Java多线程——线程八锁案例分析 摘要:本文主要学习了多线程并发中的一些案例. 部分内容来自以下博客: https://blog.csdn.net/dyt443733328/article/deta ...

  7. java 多线程—— 线程让步

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  8. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  9. Java多线程--线程及相关的Java API

    Java多线程--线程及相关的Java API 线程与进程 进程是线程的容器,程序是指令.数据的组织形式,进程是程序的实体. 一个进程中可以容纳若干个线程,线程是轻量级的进程,是程序执行的最小单位.我 ...

随机推荐

  1. linux系统中批量查找文件与文件内容的方法

    在linux中查看与修改文件权限我们都必须使用命令来操作,不能像windows一样点几下就好了,下面我们简单的介绍一下linux中的相关命令 比如查找当前目录下面所有的php文件里面某个关键字 fin ...

  2. &与&&,|与||

    http://bokeid.blog.163.com/blog/static/93102786201181710259178/ &&:逻辑运算符,连接两个或多个表达式,结果为TRUE或 ...

  3. Select Option

    jQuery获取Select元素,并选择的Text和Value: 1. $("#select_id").change(function(){//code...}); //为Sele ...

  4. mysql锁 实战测试代码

    存储引擎 支持的锁定 MyISAM 表级锁 MEMORY 表级锁 InnoDB 行级锁 BDB 页面锁 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低.行级锁:开销 ...

  5. USACO翻译:USACO 2014 MARCH Silver三题

    USACO 2014 MARCH 一.题目概览 中文题目名称 农田灌溉 懒牛 牛叫 英文题目名称 irrigation lazy mooomoo 可执行文件名 irrigation lazy mooo ...

  6. IIS7应用程序池集成和经典的区别

    IIS7应用程序池集成和经典的区别 IIS7应用程序池有集成和经典两种模式,根据微软官方的介绍, 集成模式,如果托管应用程序在采用集成模式的应用程序池中运行,服务器将使用 IIS 和 ASP.NET ...

  7. Unity学习疑问记录之保卫伦敦塔学习体会

    1.生成的prefab如果要产生反向: Instantiate(Rocket, rocketPosition.position, Quaternion.Euler(new Vector3(0,0,18 ...

  8. 【5集iCore3_ADP演示视频】5-3 iCore3应用开发平台摸校准

    iCore3双核心应用开发平台基于iCore3双核心板,包含ARM.FPGA.7寸液晶屏.双通道数字示波器.任意波发生器.电压表等模块,是一款专为电子爱好者设计的综合性电子学习系统. [视频简介]本视 ...

  9. eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错? java.lang.ClassNotFoundException: com.branchitech.app.startup.AppStartupContextListener java.lang.ClassN

    eclipse java项目中明明引入了jar包 为什么项目启动的时候不能找到jar包 项目中已经 引入了 com.branchitech.app 包 ,但时tomcat启动的时候还是报错?java. ...

  10. static{ }语句块详解

    static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法.举ge例子: public class Test { public static i ...