java学习之线程
一、线程总述:
线程是java当中一个重要的内容,如果想说线程的话,那我们应该先来讲一下什么是进程。
进程:那么什么是进程呢,进程从字面上来理解就是,正在进行的程序。就比如说我们在windows当中打开任务管理器之后,我们看到的一个个程序一样。这个程序是在内存当中运行的,我们也可以说,进程就是对应在内存当中该程序所开辟的内存空间。在程序当中程序并不是负责程序执行的,实际上真正执行的是线程也叫做执行路径,从上往下执行,进程只是负责分配内存空间。
线程:就是程序当中中,负责程序执行的控制单元,也叫做执行路径。一个进程当中可以有多个执行路径,称之为多线程。一个进程当中,至少要有一个线程。多线程的一个示例就是:360同时电脑扫描的时候,也在清理垃圾,也在扫描病毒。开启多个线程是为了同时执行部分。每个线程都有自己的运行内容,这个运行内容就是这个线程的任务。
多线程的好处:解决了多个部分同时运行的问题。
多线程的弊端:线程太多会导致效率过低。
其实应用程序的执行都是在cpu上做着快速切换完成的,这个切换是随机的。
线程的停止是由于JVM退出造成的,并不是由于主线程的退出而造成的。
JVM启动的时候,就启动了多个线程,至少有两个由分析得:
1、负责执行main函数的线程
定义在main函数内----任务
2、负责回收垃圾的线程
在垃圾回收器当中进行的
多线程示例一:垃圾回收器:
class Demo extends Object
{ /**
*覆写了Object当中的finalize方法,来改变回收垃圾时索要执行的动作
*/
public void finalize()
{ System.out.println("Hello Finalize!"); } } class ThreadDemo1
{ public static void main(String[] args) { new Demo();
new Demo();
new Demo();
new Demo();
System.gc();//调用系统当中定义的gc方法来回收垃圾
new Demo();
new Demo();
new Demo();
System.out.println("Hello World!!!"); } }
但是输出的结果是两种的:
在程序运行的时候,当调用gc方法之后尽心了垃圾的回收清除,在回收垃圾的时候就调用了finalize这个方法。
为了避免大家误解,就是说必须main这个线程执行完了之后,才执行gc的线程,这里把代码来修改一下:
class ThreadDemo1
{ public static void main(String[] args) { new Demo();
new Demo();
new Demo();
new Demo();
new Demo();
new Demo();
new Demo();
new Demo();
new Demo();
new Demo();
new Demo();
new Demo();
new Demo();
new Demo();
for(int i = ; i<; i++){}
for(int i = ; i<; i++){}
for(int i = ; i<; i++){}
for(int i = ; i<; i++){}
for(int i = ; i<; i++){} System.gc();
new Demo();
new Demo();
new Demo();for(int i = ; i<; i++){}
System.out.println("Hello World!!!"); } }
这里的输出结果是:

这里我们可以看出来,在创建完对象之后,就开始回收垃圾了。并不是执行完main函数之后才执行gc()这个方法的.那么为什么会出现之前的那种状况呢,因为通知JVM启动回收线程也是需要时间的。在这个时间内就已经执行输出了 HelloWorld 了。
java学习之线程的更多相关文章
- Java学习笔记 线程池使用及详解
有点笨,参考了好几篇大佬们写的文章才整理出来的笔记.... 字面意思上解释,线程池就是装有线程的池,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程 ...
- java学习之- 线程运行状态
标签(空格分隔): 线程运行状态 线程的运行状态: 如下是是我编写的一个图,大家可以作为参考: 1.new一个thread子类也是创建了一个线程: 2.创建完毕之后start()-----运行, 3. ...
- java学习之线程池的实现
package com.gh.threadpoor; import java.util.concurrent.ExecutorService; import java.util.concurrent. ...
- Java 学习笔记 线程控制
题目一 本质上来说,线程是不可控制的,线程的执行是由CPU资源分配决定的,我们无法干预系统CPU的资源分配,但我们可以增加条件来让线程按照我们的预想顺序来执行. 比如.如果当前的执行的线程不满足我们所 ...
- java学习之- 线程继承Thread类
标签(空格分隔): 线程 在java.lang包中有个Thread子类,大家可以自行查阅文档,及范例: 如何在自定义的代码中,自定义一个线程呢? 1.通过对api的查找,java已经提供了对线程这类事 ...
- Java学习:线程池
线程池 线程池概念:其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多的资源. 线程池:容器-->集合(ArrayList,Hash ...
- Java学习:线程的安全问题
线程的安全问题 模拟卖票案例创建三个的线程,同时开启,对共享的票进行出售 public class RunnableImpl implementsc Runnable{ //定义一个多线程共享的票源 ...
- Java学习:线程实现方式
线程实现方式 并发与并行 并发:指两或多个事件在同一个时间段内发生 并行:指两或多个事件在同一个时刻发生(同时发生) 进程的概念 内存:所有的应用程序都需要进入到内存中执行 临时存储RAM 硬盘:永久 ...
- java学习笔记 - 线程池(一)
线程池(Thread Pool):把一个或多个线程通过统一的方式进行调度和重复使用的技术,避免了因为线程过多而带来使用上的开销 优点:(面试题)可重复使用已有线程,避免对象创建.消亡和过度切换的性能开 ...
随机推荐
- Quartz Cron表达式生成器
格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , - * / 2 分 是 0 ...
- 如何关闭SELinux
一般安装linux课程时都把SELinux与iptables安排在后面,使初学者配置linux服务器时不成功,却没有头绪,那是因为在RedHat linux操作系统中默认开启了防火墙,SELinux也 ...
- 一、Maven环境搭建(windows 环境)
所需工具 : JDK 1.7 java 环境 Maven 3.3.9 下载最新版本 Windows 7 注 Maven 3.2 要求 JDK 1.6 或以上版本, 而 Maven 3.0/3. ...
- SDL实现限制帧速
很多人都在SDL_PollEvent和SDL_WaitEvent之间纠结.前者会带来更好的帧数表现,但是CPU占用极大,可以直接吃掉一个核心.后者则基本不占用CPU,但是帧数会受到影响.有没有办法使两 ...
- 10.21_Nutz批量插入顺序,POI,wiki持续关注,POI,SSH,数据库优先
(1)Nutz,dao的批量插入会关注顺序吗? http://www.douban.com/group/topic/64322582/ (2)工作需要优先!!! POI,SSH,数据库管理及plsq ...
- ZEngine游戏框架需求稿
早在2013就开始接触cocos2dx游戏框架,觉得的使用框架对于游戏开发者来说有些不方便.我便想在cocos2dx的框架基础之上实现ZEngine库,方便开发者编辑动画,以及着重于对游戏逻辑的处理. ...
- [翻译][MVC 5 + EF 6] 2:基础的增删改查(CRUD)
原文:Implementing Basic CRUD Functionality with the Entity Framework in ASP.NET MVC Application 1.修改Vi ...
- svn-添加忽略文件
svn ps svn:ignore '文件夹名|文件名(不能是文件夹/文件名)' . svn pe svn:ignore . export SVN_EDITOR=/usr/bin/vim #设置环境变 ...
- php对象的高级特性
对象比较,当同一个类的两个实例的所有属性都相等时,可以使用比较运算符==进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符===进行判断. class Car { } $a = ...
- oracle工具 sqlplus 用户管理
可以通过system用户对普通用户解锁.alter user scott account unlock; 工具:1/ sqlplusw sqlplus 自带.调用oracle安装目录下bin目录下的e ...