/*

* 进程: 正在 进行中的程序

* 线程:就是进程中一个负责程序执行的控制单元(执行路径)

* 一个进程中可以有多个执行路径,称之为多线程。

*

* 一个进程中至少要有一个线程。

*

* 开启多个线程是为了同时运行多部分代码。

*

* 每一个线程都有自己运行的内容,这个内容可以成为线程要执行的任务。

*

第一种方法***********************************************

* 创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。

*

* 步骤:

* 1.定义一个类继承Thread类。

* 2.覆盖Thread类中的run方法。

* 3.创建线程对象。

* 4.开启线程  (即调用  Thread的start()方法)

*

*/

public class ThreadTest

{

public static void main(String[] args)

{

/*

* 创建线程的目的是为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行。

* 而运行的指定代码就是这个执行路径的任务。

* jvm创建的主线程的任务都是定义在 了主函数中。

*

* 而自定义的线程的任务。。。  Thread类用于描述线程,线程是需要任务的。所以Thread类也是任务的描述。

* 这个任务就是通过Thread类中的run方法来体现 的。也就是说。run方法 就是封装自定义线程运行任务的函数。

*

* run方法中定义的就是线程中要运行的任务代码。

*

* 开启线程是为了 运行 指定的代码,所以只有继承 Thread类,并重写run方法。

* 将运行的代码 定义在run方法中即可。。。。。。。

*/

//第三步:   创建线程类

Demo d1 = new Demo("杨超");

Demo d2 = new Demo("刘媛");

//第四步:   开启线程

d1.start();

d2.start();

}

}

//第一步 :   定义一个类继承Thread类

class Demo extends Thread

{

private String name;

Demo(String name)

{

this.name = name;

}

//第二步  : 覆盖Thread类中的run方法。

public void run()

{

for(int i=0; i<10; i++)

{

System.out.println(name+"....i="+i
);

}

}

}

l

多线程的运行图解


第二种方法**************************************************

/*

* 创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。

* 然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动

*

* 步骤:

* 1.定义类实现Runnable接口。

* 2.覆盖接口中的run方法,将线程的任务代码封装到run方法中。

* 3.通通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数的参数进行传递。


为什么?因为线程的任务都封装在 Runnable接口子类的run方法中。


所以要在线程对象创建时就必须明确要运行的任务。

* 4.调用线程对象的start方法开启线程。

*

* 实现Runnable接口的好处:

* 1.将线程的任务从线程的子类中分离出来了。进行了单独的封装。


按照面向对象的思想将任务封装成对象。

* 2.避免了java单继承的局限性。

* 所以 创建线程的第二种方式 即用实现接口的方法 较为常用。

*/

public class ThreadTest2

{

public static void main(String[] args)

{

// TODO Auto-generated method stub

Dem d1 = new Dem();

Thread t1 = new Thread(d1);

t1.start();

}

}

class Dem implements Runnable//准备扩展类的功能,让其内容可以作为线程的任务执行。

//通过接口的形式完成。

{

@Override

public void run()

{

// TODO Auto-generated method stub

say();

}

public void say()

{

System.out.println();

}

}

l




Java中Thread类的start()和run()的区别

1、start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。 



通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后JVM通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程执行体,它包含了要执行的这个线程的内容,run方法运行结束,此线程终止,而CPU再运行其它线程, 



2、run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。 



如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程,只有这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的。 

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java——多线程的更多相关文章

  1. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  2. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  3. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  4. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  5. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  6. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  7. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  8. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

  9. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  10. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

随机推荐

  1. AFNetworking、MKNetworkKit和ASIHTTPRequest对比

    之前一直在使用ASIHTTPRequest作为网络库,但是由于其停止更新,iOS7上可能出现更多的问题,于是决定更换网络库. 目前比较流行的网络库主要有AFNetworking和MKNetworkKi ...

  2. 未能加载文件或程序集“System.WEB.DataVisualization, Version=3.5.0.0, Culture=neutral

    项目打开 提示 如题错误. 最近用VS2010 + .NET Framework3.5SP1开发程序,使用了MsChart,但是部署到服务器的时候提示如下错误: 分析器错误消息: 未能加载文件或程序集 ...

  3. C++除法取整

    使用floor函数.floor(x)返回的是小于或等于x的最大整数.如:     floor(2.5) = 2 floor(-2.5) = -3 使用ceil函数.ceil(x)返回的是大于x的最小整 ...

  4. hdu 2052

    PS:竟然一次AC....惊喜...注意每个实例后跟一个空行.. 学到一个快速清空数组的用法...memst函数.  memst(void *s,char a,sizeof n)  把 s里面的前n个 ...

  5. hdu 2029

    PS:  逻辑问题... 代码: #include "stdio.h"#include "string.h"int main(){ char a[110]; i ...

  6. 开启Ubuntu php错误提示 ZT

    开启Ubuntu php错误提示 在Ubuntu下,LAMP中PHP错误是不提示的,只会出现一个空白页.当然,这对于运行的生产环境来说是必须的.但有时候也需要查看生产环境上错误提示,那么只要通用下面简 ...

  7. MySQL内置函数

    MySQL中的内置系统函数 用在SELECT语句,以及字句where  order by   having 中UPDTE   DELETE 函数中可以将字段名作为变量来用,变量的值就是这个列对应的每一 ...

  8. Android重写getResources规避用户调整系统字体大小影响Android屏幕适配

    Android屏幕适配一直是一个头疼的问题.除此之外还要考虑APP在实际应用场景中,用户千奇百怪的设置,最常见的用户设置行为就是设置手机的字体大小,比如把字体设置成超大或者超小,这对屏幕适配又带来额外 ...

  9. 9、C#基础整理(多维数组)

    多维数组 1.二维数组: 表示方法: int[y,x],x.y是索引,y代表行,x代表列. 例: , ]{ {,,}, {,,} };//{}可以不写 修改方法: second[, ] = ;//表示 ...

  10. HDU 4666

    http://acm.hdu.edu.cn/showproblem.php?pid=4666 求m维最远曼哈顿距离 借鉴别人的思路http://www.cnblogs.com/jackge/archi ...