前文已介绍过多线程的基本知识了,比如什么是多线程,什么又是进程,为什么要使用多线程等等。

在了解了软件开发中使用多线程的基本常识后,我们今天来聊聊如何简单的使用多线程。

在Java中创建多线程的方式有两种:

(1)写一个子类,这个类要继承自Thread类,于此同时这个子类必须要重写Thread类中的run方法(原因我后文中会提到),然后我们就可以用这个类来创建出一个多线程。

(2)仍然是写一个类,这个类要实现Runnable接口,与(1)相同,在这个实现类中也需要重写run方法。

这里有一点要注意:C#可以随意使用任何方法,来作为一个新线程的方法,而java必须通过以上两种途径中的任意一种来实现这一个类,然后用这个类来创建一个新线程


使用第一种方法:继承Thread父类

1、定义一个继承自Thread类的子类,并且重写run()方法,run(),这个run方法,就是未来新线程要运行的具体任务或者叫做功能。

2、实例化(new)出刚才定义的子类

3、运行这个新对象的的start方法。务必记住是start方法,只有这样才会启动一个新的线程。如果是运行run方法,那么仍然是简单的单线程执行

 public class FirstThread extends Thread
{
private int i;
public void run()
{
for(;i<=100;i++)
{
System.out.println(getName());
}
}
public static void main(String[] args)
{
for(int i=0;i<100;i++)
{
if(i%10==0)
{
new FrirstThread.start();
new FrirstThread.start();
}
}
}
}

使用第二种方法:通过实现Runnable接口,来开辟新线程

1、定义一个类,这个类需要实现Runnable接口,仍然需要在该类中重写接口中的run方法,与方法1一样,这个run方法也是未来的线程执行体

2、实例化(new)出刚才定义的类A(防盗连接:本文首发自王若伊_恩赐解脱http://www.cnblogs.com/jilodream/ )

3、实例化(new)出一个Thread类,并以A作为target,运行start方法

 public class SecondThread implements Runnable
{
private int i;
public void run()
{
for(;i<=100;i++)
{
System.out.println(Thread.currentThread().getName());
}
}
public static void main(String[] args)
{
for(int i=0;i<100;i++)
{
if(i%10==0)
{
SecondThread st=new SecondThread()
new Thread(st,"name1").start();
new Thread(st,"name2").start();
}
}
}
}

 


两种开辟多线程方式的比较

1、在继承方面:由于java 不允许多重继承,所以如果存在某个基类的需要继承情况下,方法1(使用Thread子类)的方式明显要比方法二(实现Runnable接口的)的方式要麻烦(因为方法2还可以再继承一个父类)

2、共享数据方面:方法2可以直接以新定义的类作为各个线程对象(Thread实例)的target,这样各个线程对象的target对象可以说是共享的,大家可以共同处理同一份资源(放在target中),而方法一则需要另外再写方法,或者修改构造函数

3、方法1比方法2要简单的多,也更容易理解(我是这样感觉的)。在run方法中,如果需要使用当前线程对象的方法(如getName,setName)或字段,方法一可以直接使用(因为它本身就是正在执行的线程对象),而方法二则需要使用Thread.CurrentThread()方法来获取当前执行的线程对象(因为正在运行这个方法,所以当前线程对象即为运行这个方法的线程对象(有点拗口),有点绕的味道),然后调用当前线程对象的方法。

4、无论是哪种方法开辟多线程,都请不要忘记,除了开辟和运行新线程,本身还存在一个正在执行的线程(两个例子中都是Main 线程)

5、无论是哪种方法,如果要使用新线程执行方法体,都需要使用start 方法来被动的运行 run,而不能直接运行run方法(此时就是一个简单的顺序结构,主线程会等到run方法结束后,才继续开始运行)。

Java多线程开发系列之二:如何创建多线程的更多相关文章

  1. Java多线程开发系列之四:玩转多线程(线程的控制2)

    在上节的线程控制(详情点击这里)中,我们讲解了线程的等待join().守护线程.本节我们将会把剩下的线程控制内容一并讲完,主要内容有线程的睡眠.让步.优先级.挂起和恢复.停止等. 废话不多说,我们直接 ...

  2. Java多线程开发系列之四:玩转多线程(线程的控制1)

    在前文中我们已经学习了:线程的基本情况.如何创建多线程.线程的生命周期.利用已有知识我们已经可以写出如何利用多线程处理大量任务这样简单的程序.但是当应用场景复杂时,我们还需要从管理控制入手,更好的操纵 ...

  3. C#多线程编程系列(二)- 线程基础

    目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 ...

  4. Java命令学习系列(二)——Jstack

    Java命令学习系列(二)——Jstack 2015-04-18 分类:Java 阅读(512) 评论(0) jstack是java虚拟机自带的一种堆栈跟踪工具. 功能 jstack用于生成java虚 ...

  5. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  6. 微信小程序从零开始开发步骤(二)创建小程序页面

    上一章注册完小程序,添加新建的项目,大致的准备开发已经完成,本章要分享的是 要创建一个简单的页面了,创建小程序页面的具体几个步骤: 1. 在pages 中添加一个目录 选中page,右击鼠标,从硬盘打 ...

  7. Python 多线程、多进程 (二)之 多线程、同步、通信

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...

  8. Java多线程开发系列之一:走进多线程

    对编程语言的基础知识:分支.选择.循环.面向对象等基本概念理解后,我们需要对java高级编程有一定的学习,这里不可避免的要接触到多线程开发. 由于多线程开发整体的系统比较大,我会写一个系列的文章总结介 ...

  9. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

随机推荐

  1. embed标签

    Embed(一).基本语法:embed src=url说明:embed可以用来插入各种多媒体,格式可以是 Midi.Wav.AIFF.AU.MP3等等,      Netscape及新版的IE 都支持 ...

  2. ZeroMQ接口函数之 :zmq_msg_recv - 从一个socket中接受一个消息帧

    ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq_msg_recv zmq_msg_recv(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ ...

  3. UI设计中的48dp定律【转】

    有朋友建议我偶尔写写技术类的文章,所以我打算开始穿插性的写一些偏技术方面的科普文章,尽量往小白能看懂的方向写,今天我来讲讲UI设计中的48dp定律. 那么先说说什么是dp ?其实对于一个非技术人员要把 ...

  4. Andriod如何更改应用程序小图标

    1.之前我们安装的第一个应用图标是这样的(如下图) 2.在eclipse左侧项目中找到res文件下的drawable-hdpi         3.把自己找的LOGO图标拖到文件中,之后会弹出一个消息 ...

  5. Server-Sent Events(HTML5 服务器发送事件)

    Server-Sent Events简介 Server-Sent Events(SSE)用于网页自动获取服务器上更新的数据,它是一个实时性的机制. 实时性获取数据的解决方案 对于某些需要实时更新的数据 ...

  6. 再谈java两种变量(基本类型和引用类型)(综合各路大神)

    基本类型: 基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值. int  a:   a=250: //声明变量a的同时,系统给a分配了数据空间. 引用类型: 是一个对象类型,值是什么呢? ...

  7. 利用JavaScript生成随机数字!

    <!DOCTYPE html> <html> <head> <title>1-99的随机数字</title> <script type ...

  8. 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果

    [转] 原文 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果 字数1598 阅读302 评论2 喜欢23 1.背景   RecyclerView ...

  9. 关于复选框input[type=checkbox]

    关于复选框input[type=checkbox],其实在前面的文章中说过一次,当时主要关注点在设置复选框的状态,利用prop实现,今天继续关注一下复选框. 自己在项目中,遇到一个全选/全不选的需求, ...

  10. JS操作cookie

    JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求.cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由Ja ...