现在我们有这么一个需求,就是在主线程在运行的同时,我们想做其他的任务,这个时候我们就用到了多线程。那么如何创建多线程,我们知道在系统当中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学习多线程之创建多线程一的更多相关文章

  1. Java学习笔记44(多线程一:Thread类)

    多线程的概念:略 多线程的目的:提高效率 主线程: package demo; //主线程 public class Demo { public static void main(String[] a ...

  2. JAVA之多线程的创建

    转载请注明源出处:http://www.cnblogs.com/lighten/p/5967853.html 1.概念 老调重弹,学习线程的时候总会牵扯到进程的概念,会对二者做一个区分.网上有较多的解 ...

  3. Java学习多线程第一天

    内容介绍 Thread 线程创建 线程池 线程状态图 1 多线程 1.1     多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序 ...

  4. Java学习---多线程的学习

    基础知识 每个正在系统上运行的程序都是一个进程(process).每个进程包含一到多个线程(thread).进程也可能是整个程序或者是部分程序的动态执行. 线程是一组指令的集合,或者是程序的特殊段,它 ...

  5. Java基础学习——多线程之创建任务

    这次来盘点一下Java中用线程执行任务的写法. 1.扩展Thread 最基本的实现方法是在创建一个继承Thread的新类,在其中覆盖run()方法执行任务. public class MyThread ...

  6. java学习多线程之卖票示例

    这一节我们来说一个示例就是卖票示例: 需求: 我们现在有100张票,然后分四个窗口来卖,直到卖完为止. 思路: 1.先定一个一个票类,描述票的属性,还有打印卖出的票,并且实现Runnable中的run ...

  7. java学习——多线程

    本文内容来源于  历经5年锤练--史上最适合初学者入门的Java基础视频 线程:就是进程中一个负责程序执行的控制单元(执行路径) 每一个线程都有自己运行的内容.这个内容可以称为线程要执行的任务. 多线 ...

  8. [Java学习]多线程

    关于多进程与多线程 使用多进程的目的:提高CPU利用率. 使用多线程的目的:提高应用程序?利用率. 多线程与多进程区别:进程间内存独立:同一个进程的线程间共享"堆内存和方法区内存" ...

  9. Java学习多线程第二天

    内容介绍 线程安全 线程同步 死锁 Lock锁 等待唤醒机制 1    多线程 1.1     线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果 ...

随机推荐

  1. Installation error INSTALL_FAILED_VERSION_DOWNGRADE错误

    最近折腾了一下Robotium自动化测试框架,发现问题还挺多,刚刚解决了一个问题,总算是把环境搞定了,可是一运行测试用例,发现又报Installation error INSTALL_FAILED_V ...

  2. java 简单分页/总结

    模型(实体) dao层 dao的实现daoimpl层 service层 然后是servlet 把service层加载到servlet中就可以传值了,马上就能看见效果了 jsp页面来了 当然不能忘了在L ...

  3. c#md5与SHA1验证函数

    /// <summary> /// MD5验证函数 /// </summary> /// <param name="fileName">文件的路 ...

  4. JavaScript 学习笔记-- ES6学习(一)介绍以及Babel的使用

    本文摘自阮一峰老师的<ECMAScript 6入门>,原文地址:http://es6.ruanyifeng.com/#docs/intro ECMAScript 6 是一个泛指,含义是5. ...

  5. ES6的编码风格

    编程风格 [转自http://es6.ruanyifeng.com/#docs/style] 块级作用域 字符串 解构赋值 对象 数组 函数 Map结构 Class 模块 ESLint的使用 本章探讨 ...

  6. css滚动条样式

    1.横向滚动条:(abeamScroll) <div style="width:400px;height:200px;overflow-x:auto;overflow-y:hidden ...

  7. leetcode345——Reverse Vowels of a String(C++)

    Write a function that takes a string as input and reverse only the vowels of a string. Example 1:Giv ...

  8. Essential C++ 学习笔记01--基本语法

    <Essential C++>1.1-1.4节笔记 1. main 函数 main 函数是代码的入口,若无 main 函数,编译不通过. main 函数通常声明为 int, return ...

  9. rpm命令详解

    http://www.rpm.org/max-rpm/s1-rpm-install-additional-options.html#S2-RPM-INSTALL-REPLACEFILES-OPTION ...

  10. HDU 5619 Jam's store

    Jam's store Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...