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 线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果 ...
随机推荐
- 了解JavaScript的执行上下文
转自http://www.cnblogs.com/yanhaijing/p/3685310.html 什么是执行上下文? 当JavaScript代码运行,执行环境非常重要,有下面几种不同的情况: 全局 ...
- window环境下 node.js 游戏框架pomelo 安装与启动
一.软件准备 1.1 下载node.js 1.2 下载python 2.5 < version <3.0 1.3 下载c++编译器(一般控制面板中-->程序和功能上已有,如果没有需要 ...
- thinkphp 模板中赋值
在项目开发的时候,有时候希望直接在模板中调用 一些自定义方法,或者内置方法来,处理获得一些数据,并且赋值给一个变量给后面调用,这个时候如果用原生Php 的方式调用如下:<?php $abc = ...
- UVA 11384 Help is needed for Dexter(问题转化 递归)
Help is needed for Dexter Time Limit: 3 Second Dexter is tired of Dee Dee. So he decided to keep Dee ...
- Codevs 2370 小机房的树
2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为 ...
- 【转】CHAR CHARACTER VARCHAR NCHAR NVARCHAR NVARCHAR2区别
http://blog.csdn.net/lhl6688/article/details/44156823?ref=myread oracle提供了五种字符数据类型:char.nchar.varcha ...
- sql的连接查询方式
1 SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中 ...
- js 验证输入框金额
$("#ipt1").keyup(function () { var reg = $(this).val().match(/\d+\.?\d{0,2}/); var txt = ' ...
- JS将搜索的关键字高亮显示实现代码
这篇文章介绍了JS将搜索的关键字高亮显示实现代码,有需要的朋友可以参考一下 用JS让文章内容指定的关键字加亮 是这样的.. 现在有这些关键字:美容,生活,购物 当在文章里头出现这些关键字,就把它加亮显 ...
- 使用ajax和history.pushState无刷新改变页面URL onpopstate(转)
Javascript代码 var htmlData1 = $.ajax( { url: "/getXXXResponse", async: false }).re ...