java学习多线程之创建多线程一
现在我们有这么一个需求,就是在主线程在运行的同时,我们想做其他的任务,这个时候我们就用到了多线程。那么如何创建多线程,我们知道在系统当中qq的多线程创建是由操作系统来完成的,那么如果我们想在java当中创建多线程的话,应该如何去做呢?解决问题的时候,我们第一个应该想到的是,java当中是否给我们提供了解决该问题的对象,并且把这个对象暴漏出来供我们使用,特别是设计系统。这个时候我们去查阅javaapi。
创建线程的步骤:
1、创建一个类继承Thread类,此时这个类也就是线程
2、在该类当中覆盖Thread类的run()方法。
3、直接创建Thread子类的对象创建线程。
4、调用start()方法,开启线程,并且调用线程任务的run()方法。
在javaapi当中有一个Thread类,如果我们要使用创建多线程的话,我们应该继承Thread类,同时覆盖Thread类当中的run方法。那么为什么要覆盖Thread类当中的run方法呢?因为在Thread类本身也可以创建对象,这个对象也是有run方法的。那么我们创建线程的目的,就是去开启一个新的新的执行路径,去运行指定的代码,和其他代码一起运行。而运行的指定代码就是这个执行路径的任务。
JVM创建的主线程的任务都定义在主函数当中,而自定义的线程的任务定义在什么地方呢?Thread用于描述线程,线程是需要任务的,Thread类也有对任务的描述,这个任务就是通过Thread类当中的run()方法,那么就是run()方法就是用来封装自定义线程任务的函数。Thread描述线程->线程有任务才有意义->run()方法封装任务代码
run方法当中就是定义的线程要运行的任务代码。
如果我们要直接使用Thread当中的run()方法,那么就没有意义了,因为在run方法当中的不是我们想要执行的代码。
开启线程是为了执行指定代码,所以只有继承了Thread类,并且将要执行的指定代码封装到run方法当中,这样就可以。
代码示例:
/**
*创建线程的方法一:
*1、定义一个类继承自Thread类
*2、在该子类当中覆盖Thread类当中的run()方法,把要执行的指定代码封装到run()方法当中
*3、创建该子类的对象
*4、调用对象的start()方法,开启线程,并且调用线程当中run()方法
*/
class Demo5 extends Thread//1---定义一个类继承自Thread类
{
private String name; Demo5(String name)
{ this.name = name; }
//2----在该子类当中覆盖Thread类当中的run()方法,把要执行的指定代码封装到run()方法当中
public void run()
{ for(int x = ; x<= ; x++)
{ System.out.println("x ... is "+x); } } } class ThreadDemo5
{ public static void main(String[] args) { Demo5 d1 = new Demo5("Mike");//3---创建该子类的对象
Demo5 d2 = new Demo5("Lili");//3---创建该子类的对象
d1.start();//4-----调用对象的start()方法,开启线程,并且调用线程当中run()方法
d2.start();//4-----调用对象的start()方法,开启线程,并且调用线程当中run()方法
} }
如果我们开启了多线程,我们如何区分这些线程呢,我们查阅java api可以知道,可以通过getName()可以获得线程的名称。
class Demo2 extends Thread
{ public void run()
{ for(int i = ; i<= ; i++)
System.out.println(i+"Thread name is +"+getName()); } } class ThreadDemo2
{ public static void main(String[] args) { Demo2 d1 = new Demo2();
Demo2 d2 = new Demo2(); //d1.start();
//d2.start();
d1.run();
d2.run(); } }
现在的线程明明就main一个线程,但是线程的名称还是之前线程对象初始化时候的名称:
如果我们这样写的话,以上两种无论开启线程与否,得到的线程名称都是一样的,也就是说这里有一个注意的地方就是线程的名称是在线程初始化的时候就已经定义了,我们如果响获取当前运行线程的名称的话,我们应该先获取当前的线程 ,然后获取当前线程的名称才对的。如何获取当前的线程呢?java当中为我们提供了一个静态的方法叫做currentThread()这个方法来获取当前运行的线程的名称,我们修改上述代码为:
class Demo2 extends Thread
{ public void run()
{ for(int i = ; i<= ; i++)
System.out.println("I is :"+i+"Thread name is +"+Thread.currentThread().getName());//获取当前的线程 } } class ThreadDemo2
{ public static void main(String[] args) { Demo2 d1 = new Demo2();
Demo2 d2 = new Demo2(); d1.run();
d2.run(); } }
结果:
多线程在内存当中的表现形式:
多线程当中每个线程在栈当中都有属于自己的栈,相互之间栈互不影响。如图:
线程是进程在内存当中的进一步的划分。
java学习多线程之创建多线程一的更多相关文章
- Java学习笔记44(多线程一:Thread类)
多线程的概念:略 多线程的目的:提高效率 主线程: package demo; //主线程 public class Demo { public static void main(String[] a ...
- JAVA之多线程的创建
转载请注明源出处:http://www.cnblogs.com/lighten/p/5967853.html 1.概念 老调重弹,学习线程的时候总会牵扯到进程的概念,会对二者做一个区分.网上有较多的解 ...
- Java学习多线程第一天
内容介绍 Thread 线程创建 线程池 线程状态图 1 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序 ...
- Java学习---多线程的学习
基础知识 每个正在系统上运行的程序都是一个进程(process).每个进程包含一到多个线程(thread).进程也可能是整个程序或者是部分程序的动态执行. 线程是一组指令的集合,或者是程序的特殊段,它 ...
- Java基础学习——多线程之创建任务
这次来盘点一下Java中用线程执行任务的写法. 1.扩展Thread 最基本的实现方法是在创建一个继承Thread的新类,在其中覆盖run()方法执行任务. public class MyThread ...
- java学习多线程之卖票示例
这一节我们来说一个示例就是卖票示例: 需求: 我们现在有100张票,然后分四个窗口来卖,直到卖完为止. 思路: 1.先定一个一个票类,描述票的属性,还有打印卖出的票,并且实现Runnable中的run ...
- java学习——多线程
本文内容来源于 历经5年锤练--史上最适合初学者入门的Java基础视频 线程:就是进程中一个负责程序执行的控制单元(执行路径) 每一个线程都有自己运行的内容.这个内容可以称为线程要执行的任务. 多线 ...
- [Java学习]多线程
关于多进程与多线程 使用多进程的目的:提高CPU利用率. 使用多线程的目的:提高应用程序?利用率. 多线程与多进程区别:进程间内存独立:同一个进程的线程间共享"堆内存和方法区内存" ...
- Java学习多线程第二天
内容介绍 线程安全 线程同步 死锁 Lock锁 等待唤醒机制 1 多线程 1.1 线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果 ...
随机推荐
- web页面的生命周期
1.先上几张原理图着重理解: 现在针对第四副图原理进行解析: 流程: 1.浏览器发送请求 2.服务器软件(IIS)接收,它最终的目的就是为了向客户输出它请求的动态页面生成的html代码. 3.服务器不 ...
- ios ReactiveViewModel
项目中使用 ReactiveCocoa 一般都会嵌入ReactiveViewModel 或者 ReactiveCocoaLayout 联合处理UI.网络.动画.布局.窗口切换等,组合使用时威力惊人. ...
- 怎样区分JQuery对象和Dom对象 常用的写法
第一步,http://www.k99k.com/jQuery_getting_started.html 第二步,新手先仔细得全部看一遍jQuery的选择器,很重要!!! (http://shawphy ...
- oracle 日期格式大全
to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...
- java ,js获取web工程路径
一.java获取web工程路径 1),在servlet可以用一下方法取得: request.getRealPath(“/”) 例如:filepach = request.getRealPath(“/” ...
- webui layout like desktop rich client
similarity similarlike desktop js frameworklike extj js frameworklike rich client js frameworkjs lay ...
- DAG模型——嵌套矩阵
有向无环图上的动态规划是学习动态规划的基础,很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 嵌套矩阵 有n个矩阵,每个矩阵可以用两个整数a,b描述,表示它的长和宽.矩阵X(a,b)可以嵌 ...
- vim plugin 原理
vim 个性化设置与功能扩展均通过 script 来实现,这种 script 又叫 plugin.plugin 是 vim 的核心与精髓. 最常用的配置文件 vimrc,也是一种 plugin.换句话 ...
- 用C#实现MD5算法
/// <summary> /// 一个实现MD5散列字符串的类 /// </summary> public sealed class MD5Hash ...
- 接口Interface
接口的定义 声明接口的方式与声明类的方式相似,但使用的关键字是interface,而不是class interface IMyInterface { // 接口成员 } 访问修饰符关键字public ...