小谈Java里的线程
今天,我们来谈一谈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里的线程的更多相关文章
- 并发编程——认识java里的线程
本文系作者 chaoCode原创,转载请私信并在文章开头附带作者和原文地址链接. 违者,作者保留追究权利. 前言 并发编程在我们日常开发中是时时刻刻都有在用的,只不过大部分的代码底层已经帮我们去做了一 ...
- 小谈python里 列表 的几种常用用法
在python中列表的常用方法主要包括增加,删除,查看和修改.下面以举例子的方法具体说明,首先我们创建两个列表,列表是用[ ]表示的,里面的元素用逗号隔开. a=[‘hello’,78,15.6,‘你 ...
- Java里一个线程两次调用start()方法会出现什么情况
Java的线程是不允许启动两次的,第二次调用必然会抛出IllegalThreadStateException,这是一种运行时异常,多次调用start被认为是编程错误. 如果业务需要线程run中的代码再 ...
- 谈谈java中的线程(初级概念)
定义 关于进程与线程的定义 可参看一下这个介绍 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 在不细抠定义的情况下 ...
- 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...
- (转载)Java里快如闪电的线程间通讯
转自(http://www.infoq.com/cn/articles/High-Performance-Java-Inter-Thread-Communications) 这个故事源自一个很简单的想 ...
- 浅谈Java线程安全
浅谈Java线程安全 - - 2019-04-25 17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...
- Java 里如何实现线程间通信(转载)
出处:http://www.importnew.com/26850.html 正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程 ...
- Java 里如何实现线程间通信
正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点:thread.join(), object.w ...
随机推荐
- 【Silverlight】打开Silverlight程序报错,"未找到导入的项目......请确认<Import>声明中的路径正确,且磁盘上存在该文件"
在打开Silverlight程序时,报错(如图所示),程序使用的是Visual Studio 2013和最新的Silverlight版本(Silverlight5). 然后我在网上找了下说:Silve ...
- mina通信 demo
1,要用到4个jar 2,服务端 package mina.server; import java.io.IOException; import java.net.InetSocketAddress; ...
- GOOD MEETINGS CREATE SHARED UNDERSTANDING, NOT BRDS!
Deliverables and artifacts were a focal point of BA work during the early part of my career. If I ...
- ubuntu下出现的问题-控制台更新源失败
Ubuntu下控制台输入sudo apt-get update之后出现的问题:E: Could not get lock /var/lib/apt/lists/lock - open (11: Res ...
- 初次接触nodejs,请多指教。
一 安装nodejs 1.下载node.js.在http://nodejs.org/download/下载最新版的node.exe文件,我下载时是v0.10.33.下载完成后,在F盘新建nodejs ...
- [IOS]Swift 遍历预制的本地资源文件
我事先放了一堆svg文件,但是我是批量使用的,想要直接遍历他们加入到一个list中来,那我直接就遍历他们的名称,把他们的名字组成一个array. var ss:NSString = NSBundle. ...
- @autowired和@resource的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自 动注入罢了.@Resource有两个属性是比较重要的, ...
- 【hihoCoder】1082: 然而沼跃鱼早就看穿了一切
题目:http://hihocoder.com/problemset/problem/1082 输入一个字符串,将其中特定的单词替换成另一个单词 代码注意点: 1. getline(istre ...
- HDU(1285)—确定比赛名次
/*最近都在复习期末了...好久没做题,都快没智商了*/ 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后 ...
- SQL Server
1.通过触发器来级联删除: 具体的触发器代码如下: Create TRIGGER [dbo].[DeleteRelatedProducts] ON [dbo].[ProductCategory] A ...