今天,我们来谈一谈Java里的线程。

一、进程与线程的基本概念

大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念。打开电脑的任务管理器,我们就可以看到许多进程。它们主要分为三类,应用进程、后台进程与windows进程。我们可以把进程称为程序运行的一个单位,而线程,就是一个比进程还小的运行单位。

引用一段百度而来的关于进程与线程的资料:

进程和线程都是由操作系统所体现的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。 
进程和线程的区别在于:
简而言之,一个程序至少有一个进程,一个进程至少有一个线程。

二、多线程的概念

知道了线程是什么,接下来我们来讲一讲多线程的概念。多线程,顾名思义,就是多个线程一起工作。我看过这么一种举例,这里借来用作说明。就好比吃饭,单进程单线程,就是一个人在一张桌子上吃饭。单进程多线程,就是多个人在一个桌子上吃饭。多进程多线程,就是多个人在多张桌子上吃饭。使用多线程的好处在于能够提高程序的效率。但是,对于一个线程来说,创建它需要一定的内存,运行也会消耗CPU的资源。对于我们普通电脑的内存和CPU来说,线程显得有些“昂贵”。就好比吃饭,多个人在一个桌子上吃饭难免会有拥挤。因此,实际上,多线程的运行方式并非多个线程同时运行。而是对于一段时间来说,分为若干个极小的时间片,然后给不同的线程分配不同的时间片去让它运行。然而,这个时间过于短暂,所以我们可以看成是多个线程一块运行。

三、线程的创建

按照进程与线程的定义来看,一个程序最少有一个进程,一个进程最少有一个线程。然而,事实上,在我们自行编写一些应用程序,诸如画图板和五子棋的时候,我们并没有用到所谓的线程。这似乎与线程的概念有所违背。事实上,对于上述缩写的代码,并不是由我们去创建的线程,而是Java虚拟机帮我们创建的线程。

接下来进入我们的主题——创建线程。

创建线程有两种方法。

1、实现Runnable接口。

2、继承Thread类。

首先,我们来看第一种。实现接口我们之前有提到,implements。之后,我们需要在该类中重写Runnable类里的抽象方法。我们可以看到,在Runnable接口里,有一个名为run的抽象方法。我们需要做的是重写run方法,之后,通过调用run方法的方式,告诉Java虚拟机运行我们创建的线程。

具体代码如下:

 package thread;
public class Runnablelh implements Runnable{
public static void main(String[] args) {
Runnablelh ll=new Runnablelh();
ll.run();
}
public void run() {
System.out.println("-------------");
}
}

不过,我们常用的多为第二种方式。Thread类是API中一个实现了Runnable接口的类,不过在Thread类中添加了一些与线程操作相关的方法。比如start、sleep等等。这里,我们不再调用run方法,而是改为调用start方法告诉虚拟机运行我们的线程。

给出一段代码:

 package thread;
public class threadtext extends Thread{
public static void main(String[] args) {
for(int i=0;i<5;i++){
threadtext t=new threadtext();
t.start();
}
}
public void run(){
System.out.println("线程"+Thread.currentThread()+"正在运行");
}
}

注意,这里的currentThread方法表示的是输出该线程的名字。线程的名字可以自行设置,若没有设置则是由系统自动提供。

这里注意一个细节,当你运行这段程序的时候,得到的结果可能不完全相同。以下给出两次运行的结果:

之前我们提到过,我们的start与run是告诉Java虚拟机需要运行我们的线程。然而这个时间是不确定的,所以就导致了两次结果的不相同。注意一点,对于一个线程,一般情况下,当你的run方法运行完,那么一个线程就结束了。除非你加上了一些语句使得线程不关闭或者延长其运行时间。

以上,就是我对于线程的一些认识。如有不对之处,请大家指正。

小谈Java里的线程的更多相关文章

  1. 并发编程——认识java里的线程

    本文系作者 chaoCode原创,转载请私信并在文章开头附带作者和原文地址链接. 违者,作者保留追究权利. 前言 并发编程在我们日常开发中是时时刻刻都有在用的,只不过大部分的代码底层已经帮我们去做了一 ...

  2. 小谈python里 列表 的几种常用用法

    在python中列表的常用方法主要包括增加,删除,查看和修改.下面以举例子的方法具体说明,首先我们创建两个列表,列表是用[ ]表示的,里面的元素用逗号隔开. a=[‘hello’,78,15.6,‘你 ...

  3. Java里一个线程两次调用start()方法会出现什么情况

    Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start被认为是编程错误. 如果业务需要线程run中的代码再 ...

  4. 谈谈java中的线程(初级概念)

    定义 关于进程与线程的定义 可参看一下这个介绍 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 在不细抠定义的情况下 ...

  5. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  6. (转载)Java里快如闪电的线程间通讯

    转自(http://www.infoq.com/cn/articles/High-Performance-Java-Inter-Thread-Communications) 这个故事源自一个很简单的想 ...

  7. 浅谈Java线程安全

    浅谈Java线程安全 - - 2019-04-25    17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...

  8. Java 里如何实现线程间通信(转载)

    出处:http://www.importnew.com/26850.html 正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程 ...

  9. Java 里如何实现线程间通信

    正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点:thread.join(), object.w ...

随机推荐

  1. Java-Android【2】-弹出对话框

    一.在Activity的方法中加入代码 new AlertDialog.Builder(this) .setTitle("Title") .setMessage("Mes ...

  2. solr4.5安装配置 linux+tomcat6.0+mmseg4j-1.9.1分词

    首先先介绍下solr的安装配置 solr下载地址 (我这用的solr-4.5.0) 运行环境 JDK 1.5或更高版本 下载地址(Solr 4以上版本,要求JDK 1.6)  我用的JDK1.6 ) ...

  3. ElasticSearch问题记录

    1.Young GC导致集群master重新选举,一台server fail [2016-12-10 07:38:24,546][WARN ][transport ] [BFRD_1] Receive ...

  4. NOIP2016普及总结

    ---恢复内容开始--- 当时我说如果不出意外有385,结果就这么跪在了第二题,惨啊 本来以为发挥算正常,结果这发挥太不正常了 [T1] 水题啊[趴 注意下细节就好考你会不会写代码. [T2] 这题大 ...

  5. css3的动画特性

    css3 的过渡动画,有些时候会产生一些其他问题. 比如:你想先改一个css属性,之后再进行动画过渡,结果实际上你会发现,css属性和动画是同步进行的.这个应该是在编译阶段就确定好了. 所以只能通过s ...

  6. CF-补题1

    CF-补题1 1.CodeForces 735C    题意:n个人淘汰赛,两个人可以比赛的条件是:两人打过的场数之差绝对值<2.求冠军最多可以打多少场.  总结:看了题解,转换一下思路.求n个 ...

  7. View的滑动

    View的滑动 通过三种方式可以实现View的滑动: 1.通过View本身提供的scrollTo/scrollBy方法来实现滑动 2.通过动画给View施加平移效果来实现滑动 3.通过改变View的L ...

  8. jquery中focus()失效怎么解决

    又学到一个新的知识! 今天在写表单验证的时候遇到一个关于获取焦点的focus()问题. 场景说明:在验证密码输入格式不对之后,弹出alert()提示框,提示密码不对,请重新输入.同时清空密码框并获得焦 ...

  9. 一些gcd计数问题

    数论什么的全都忘光了吧QAQ 做了几道简单的题练习一下. bzoj1101: [POI2007]Zap 求有多少对数满足 gcd(x,y)=d, 1<=x<=a, 1<=y<= ...

  10. 非常棒的Android对话框效果

    FlycoDialog_Master http://www.see-source.com/androidwidget/detail.html?wid=488 带有各种动画效果的弹出对话框控件.你也可以 ...