Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux

Java实现线程的三种方式

Java实现线程的三种方式

并发不一定要依赖多线程(如PHP中很常见的多进程并发)。线程的实现各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的基本单位)。每个已经执行start()且还未结束的java.lang.Thread类的实例就代表了一个线程。Thread的所有关键方法都是声明为Native的。在Java API中,一个Native方法往往意味着这个方法没有使用或无法使用平台无关的手段来实现(当然也可能是为了执行效率而使用Native方法...
JVM垃圾收集算法

JVM垃圾收集算法

标记-清除算法(Mark-Sweep)算法分为:“标记”和“清除”两个阶段。主要不足:1)效率问题:标记和清除两个过程的效率都不高2)空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。标记--清除算法示意图:复制算法(Copying)它将可用内存按容量划分为大小相等的两块,每次只使用其中一块...
图的基本概念和表示

图的基本概念和表示

基本概念一个图(graph)G=(V,E)由顶点(vertex)的集V和边(edge)的集E组成。每一条边就是一副点对(v,w),其中v、w ? V。有时也把边称做弧(arc)。有向(directed):如果点对是有序的,那么图就是有向的。有向图(digraph):有向的图有时也叫有向图。路径u,v,u可以被认为是圈,因为(u,v)和(v,u)不是同一条边。无向图:与有向图相对,我们要求边是互异的。这些要求的根据在于无向图中的路径u,v,u不应该被认为是圈...
Java排序算法--归并排序(MergeSort)

Java排序算法--归并排序(MergeSort)

简介归并排序以O(NlogN)最坏情形时间运行,而所使用的比较次数几乎是最优的。这个算法中基本的操作是合并两个已排序的表。基本的合并算法是取两个输入数组A和B,一个输出数组C,以及3个计数器Actr、Bctr、Cctr,它们初始置于对应数组的开始端。A[Actr]和B[Bctr]中的较小者被拷贝到C中的下一个位置,相关的计数器向前推进一步。当两个输入表有一个用完的时候,则将另一个表中剩余部分拷贝到C中。合并两个已排序的表的时间显然是线性的,因为最多进行N-...
Java排序算法--桶式排序(Bucket Sort)

Java排序算法--桶式排序(Bucket Sort)

任何只使用比较的一般排序算法的最坏情况下需要运行时间Ω(NlogN),但是记住,在某些特殊情况下以线性时间进行排序仍然是可能的。一个简单的例子是桶式排序(bucket sort)。为使桶式排序能够正常工作,必须要有一些附加的信息。输入数据A1,A2,A3,…,AN必须只由小于M的正整数组成(显然还可以对其进行扩充)。如果是这种情况,那么算法很简单:使用一个大小为M的称为count的数组,它被初始化为全0。于是,count有M个单元...
Java类与类加载器

Java类与类加载器

虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放在Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。类加载器应用在:类层次划分、OSGi、热部署、代码加密等领域。类与类加载器对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。...
Java排序算法--希尔排序(Shellsort)

Java排序算法--希尔排序(Shellsort)

希尔排序希尔排序:它通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。希尔排序也叫缩减增量排序(diminishing increment sort)。希尔排序使用一个序列h1,h2,h3,…,ht,叫做增量序列(increment sequence)。在使用增量hk的一趟排序之后,对于每一个i我们都有a[i]≤a[i+hk],所有相隔hk的元素都被排序,此时称文件是hk排序...
JVM 垃圾回收算法

JVM 垃圾回收算法

在说垃圾回收算法之前,先谈谈JVM怎样确定哪些对象是“垃圾”。1.引用计数器算法:引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象不再被使用,是“垃圾”了。引用计数器实现简单,效率高;但是不能解决循环引用问问题(A对象引用B对象,B对象又引用A对象,但是A,B对象已不被任何其他对象引用),同时每次计数器的增加和...
Java 线程安全 Lock

Java 线程安全 Lock

java.util.concurrent.locks 对于线程安全我们前面使用了synchronized关键字,对于线程的协作我们使用Object.wait()和Object.notify()。在JDK1.5中java为我们提供了Lock来实现与它们相同的功能,并且性能优于它们,在JDK1.6时,JDK对synchronized做了优化,在性能上两种方式差距不大了。一、为什么出现lock synchronized修饰的代码块,当一个线程获取了对应的锁,...
Java 线程安全 synchronized

Java 线程安全 synchronized

一、线程安全问题:并发编程的原则:设计并发编程的目的是为了使程序获得更高的执行效率,但绝不能出现数据一致性(数据准确)问题,如果并发程序连最基本的执行结果准确性都无法保证,那并发编程就没有任何意义。为什么会出现数据不正确: 如果一个资源(变量,对象,文件,数据库)可以同时被很多线程使用就会出现数据不一致问题,也就是我们说的线程安全问题。这样的资源被称为共享资源或临界区。 举个例子: 一个共享变量m,现在有两个线程同时对它进行累加操作,各执行100...
Java 线程的终止与线程中断

Java 线程的终止与线程中断

关于线程终止: 1、一般来讲线程在执行完毕后就会进入死亡状态,那该线程自然就终止了。 2、一些服务端的程序,可能在业务上需要,常驻系统。它本身是一个无穷的循环,用于提供服务。那对于这种线程我们该如何结束它呢。 一、线程的终止 在Thread类中JDK给我们提供了一个终止线程的方法stop(); 该方法一经调用就会立即终止该线程,并立即释放对象锁。如果当一个线程执行一半业务而调用了该方法,可能就会产生数据不一致问题。 数据一致性:同一时间点,你在节点A中...
Java 线程协作 wait(等待)与 notiy(通知)

Java 线程协作 wait(等待)与 notiy(通知)

一.wait()、notify()和notifyAll()为了更好的支持多线程之间的协作,JDK提供了三个重要的本地方法//调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的锁.public final void wait() throws InterruptedException { wait(0); }//调用某个对象的notify()方法能够唤醒一个正在等待这个对象的锁的线程,如果有多个线程都在等待这个对象的锁,则只...
基于Java的宽度优先遍历互联网结点

基于Java的宽度优先遍历互联网结点

整个的宽度优先爬虫过程就是从一系列的种子节点开始,把这些网页中(种子结点网页)的“子节点” (也就是超链接)提取出来,放入队列中依次进行抓取。被处理过的链接需要放入一张表(通常称 为 Visited 表)中。每次新处理一个链接之前,需要查看这个链接是否已经存在于 Visited 表 中。如果存在,证明链接已经处理过,跳过,不做处理,否则进行下一步处理。实际的过 程如图 1.5 所示。初始的 URL 地址是爬虫系统中提供的种子 URL...
基于Java实现的宽度优先遍历互联网

基于Java实现的宽度优先遍历互联网

整个的宽度优先爬虫过程就是从一系列的种子节点开始,把这些网页中(种子结点网页)的“子节点” (也就是超链接)提取出来,放入队列中依次进行抓取。被处理过的链接需要放入一张表(通常称 为 Visited 表)中。每次新处理一个链接之前,需要查看这个链接是否已经存在于 Visited 表 中。如果存在,证明链接已经处理过,跳过,不做处理,否则进行下一步处理。实际的过 程如图 1.5 所示。初始的 URL 地址是爬虫系统中提供的种子 URL...
JavaScript 基础、进阶以及 Ubuntu 系统中的 JavaScript 开发调试工具

JavaScript 基础、进阶以及 Ubuntu 系统中的 JavaScript 开发调试工具

阅读目录前言对象和原型链我使用的画图工具Graphviz作用域链、上下文环境和闭包函数和this用JavaScript模拟经典的面向对象编程JavaScript的模块化写法总结前言 JavaScript 是我接触到的第二门编程语言,第一门是 C 语言。然后才是 C++、Java 还有其它一些什么。所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了。早就想写一篇关于 JavaScript 方面的东西,从入门的学习笔记到高手的心得体会一应俱...
Java 线程协作 yield()

Java 线程协作 yield()

yield():方法的定义调用yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程。 但是yield不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程有获取CPU执行时间的机会 (Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程, cpu会从众多的可执行态里选择.),优先级高的线程业不一定会获得执行权,他们只是概率上大些。该方法不会释放锁。注意:调用yield方法并不会让线程进入阻塞状态,...
Java 线程协作 join()

Java 线程协作 join()

在实际开发中我们往往会遇到这样的情况一个线程的执行需要依赖另一个线程执行后的结果。即主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。join()join() 方法主要是让调用该方法的thread完成run方法里面的任务后, 再执行join()方法后面的代。主线程生成并起动了...
在Linux中使用VS Code编译调试C++项目

在Linux中使用VS Code编译调试C++项目

最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项。关于VS Code在Linux下的安装这里就不提了,不管是CentOS还是Ubuntu,如果不懂且搜Q足够的情况下,你会解决的。一. 前置知识——gcc/g++的编译链接过程在Windows下,如果你用Visual Studio进行开发,C/C++的编译器一般采用微软提供的MSBuild;在Linux下C...
从汇编角度分析C语言的过程调用

从汇编角度分析C语言的过程调用

基本术语定义1.系统栈(system stack)是一个内存区,位于进程地址空间的末端。2.在将数据压栈时,栈是自顶向下增长的,该内存区用于函数的局部变量提供内存。它也支持在调用函数时传递参数。3.如果调用了嵌套的过程,栈会自上而下增长,并接受新的活动记录(activation record)来保存一个过程所需的所有数据。4.当前执行过程的活动记录,由标记顶部位置的帧指针(frame point)和标记底部位置的栈指针(stack point)定义。5.在...
<< 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 >>