现在我们有这么一个需求,就是在主线程在运行的同时,我们想做其他的任务,这个时候我们就用到了多线程。那么如何创建多线程,我们知道在系统当中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. 1_使用Java文件的并发写

    为了实现,并发写操作,首先实验一下在本地情况下, 将一个文件切分成若干个 文件块 然后将文件块 通过多线程的并发的方式写入到指定目录下的文件中. 下面是简单的试着实现代码,暂时 先进行记录一下: im ...

  2. Oracle抓取表结构的语句

    oracle ---------------------------------------   SELECT case when t.COLUMN_ID=1 then t.table_name en ...

  3. java新手笔记21 接口

    1.接口 package com.yfs.javase; public interface IDemo1 {//interface 接口 public /*abstract*/ void method ...

  4. 使用ibatis时 sql中 in 的参数赋值

    一.问题描述: 1.在使用ibatis执行下面的sql: update jc_jiesuan set doing_time = unix_timestamp(curdate()),doing_stat ...

  5. windows server 2003 取消登录Ctrl+Alt+delete

    安装Windows Server 2003操作系统的, 在console登录默认要先按下Ctrl+Alt+Delete组合键然后才弹出登录对话框 要取消这个限制的方法是: 点击 “开始-->运行 ...

  6. Python GUI with Tkinter (from youtube) 在youtube上能找到很多编程视频...

    Python GUI with Tkinter - 1 - Introduction以上链接是一个python tkinter视频系列的第一讲的链接.虽然英语不好,但是,程序还是看得懂的(照着做就可以 ...

  7. LINUX开机启动过程

    LINUX开机启动过程 启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息 ...

  8. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(一)

    项目组用air来开发手游, 但有些在原生应用里很容易实现的功能没有办法在air中直接调用,比如说震动,服务等等.但Adobe 提供了一种方法让air间接调用本地代码(java,object-c...) ...

  9. Linux下Docker安装

    1 在 CentOS 6.4 上安装 docker   docker当前官方只支持Ubuntu,所以在 CentOS 安装Docker比较麻烦(Issue #172).   docker官方文档说要求 ...

  10. 浅谈.prop() 和 attr() 的区别

    今天编码时遇到一个问题,通过后台查询的数据设置前端checkbox的选中状态,设置选中状态为.attr('checked','true');没有问题,但是当数据重新加载时,checkbox应清空即所有 ...