线程

Android第十九天

会有一股神秘感。 提交于 2020-04-07 10:53:34
一:进程与线程 进程:进程是程序的一次运行过程。进程是操作系统分配资源和调度的基本单位。 线程:线程是程序的一条执行路径。 一个进程至少包含一个线程。 引入多线程的必要性:多个线程的切换开销小,可以实现并发(宏观上一起执行)执行的效果。 二:实现多线程的方式 1.继承Thread类,复写run()方法。在run()方法里实现线程的操作。 使用start()方法启动线程。 2.实现Runnable接口,复写run()方法。使用start()方法启动线程。 public Thread(Runnable target,String name) 实现Runnable接口实现多线程的好处: 1.可以避免Java的“单继承”缺陷。 2.可以实现资源共享。 三:线程中的常用方法 public Thread(String name) public Thread(Runnable target,String name) 1.getName() 返回该线程的名称。 2.public static Thread currentThread() 返回对当前正在执行的线程对象的引用。 3.public static void sleep(long millis) 线程休眠指定的毫秒数 4.setPriority(int newPriority) 优先级高的不一定先执行。 (不靠谱) 5.public

C#线程暂停和继续操作

荒凉一梦 提交于 2020-04-07 10:39:56
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace XCZT { public partial class Form1 : Form { public Form1() { InitializeComponent(); Label.CheckForIllegalCrossThreadCalls = false; } ManualResetEvent ma = new ManualResetEvent(false); bool stop = false; //启动 private void button1_Click(object sender, EventArgs e) { Thread thread = new Thread(Runtime); stop = false; ma.Set();// 信号打开,不阻塞当前线程 thread.Start

分布式之数据库和缓存双写一致性方案解析(三)

我的未来我决定 提交于 2020-04-07 10:30:26
正文 博主本来觉得, 《分布式之数据库和缓存双写一致性方案解析》 ,一文已经十分清晰。然而这一两天,有人在微信上私聊我,觉得应该要采用 先删缓存,再更新数据库,再删缓存 这一方案作为缓存更新策略,而不是先更新数据库,再删缓存。并且搬出了两篇大佬的文章, 《Cache Aside Pattern》 , 《缓存与数据库不一致,咋办?》 ,希望博主能加以说明。因为问的人太多了,所以才有了这篇文章的诞生。 正文 在开始这篇文章之前,我们先自己思考一下以下两个更新策略 方案一 (1)删缓存 (2)更数据库 (3)删缓存 方案二 (1)更数据库 (2)删缓存 大家看下面的文章前,自己先思考一下, 方案一的步骤(1)有没有存在的必要 ? 先上一个结论:方案二存在的缺点,方案一全部存在,且方案一比方案二多一个步骤,所以应该选方案二。 下面,针对 《Cache Aside Pattern》 , 《缓存与数据库不一致,咋办?》 这两篇文章提出的论点,提出小小的质疑。这两篇文章认为方案二不行的原因,主要有以下两点 (1)方案二在步骤(2),出现删缓存失败的情况下,会出现数据不一致的情形,如下图所示 Cache Aside Pattern方案存在什么问题? 答:如果先操作数据库,再淘汰缓存,在原子性被破坏时: (1) 修改数据库成功了 (2) 淘汰缓存失败了 导致,数据库与缓存的数据不一致 (2

线程之线程终止

ε祈祈猫儿з 提交于 2020-04-07 10:18:19
如果进程中的任一线程调用了exit、_Exit或者_exit,那么整个进程就会终止。与此类似,如果信号的默认动作是终止进程,那么,把该信号发送到线程会终止整个进程。 单个线程可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。 (1)线程只是从启动例程中返回,返回值是线程的退出码。 (2)线程可以被同一进程中的其他线程取消。 (3)线程调用pthread_exit。 #include <pthread.h> void pthread_exit(void *rval_ptr); rval_ptr是一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程可以通过调用pthread_join函数访问到这个指针。 #include <pthread.h> int pthread_join(pthread_t thread, void **rval_ptr); 返回值:若成功则返回0,否则返回错误编号 调用线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程中返回或者被取消。如果线程只是从它的启动例程返回,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就置为PTHREAD_CANCELED。 可以通过调用pthread_join自动把线程置于分离状态,这样资源就可以恢复。如果线程已经处于分离状态,pthread

Linux线程基础函数

主宰稳场 提交于 2020-04-07 10:17:58
1. 线程标识: (1) 比较两个线程ID; #include <pthread.h> int pthread_equal(pthread_t tid1, pthread_t tid2); ret-若相等则返回非0值,否则返回0值 (2) 获取线程自身ID; #include <pthread.h> pthread_t pthread_self(void); ret-调用线程的线程ID 2. 线程的创建: #include <pthread.h> int pthread_create(pthread_t *restrict tidp, //返回线程的ID           const pthread_attr_t *restrict attr, //线程属性,默认为NULL void *(*start_rtn)(void), //线程函数入口地址 void *restrict arg); //参数 ret-成功返回0 失败返回错误编号 3. 线程的终止: (1) 线程只是从启动例程中返回,返回值是线程的退出码; (2) 线程可以被同一例程中的其他线程取消; (3) 线程调用pthread_exit。 #include <pthread.h> void pthread_exit(void *rval_ptr); rval_ptr是一个无类型指针,与传递给启动例程的单个参数类似

线程(二)

♀尐吖头ヾ 提交于 2020-04-07 09:54:52
/* * 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到哪里加上了锁,在哪里释放了锁 * 为了更清晰的表达如何加锁和释放锁, JDK5 以后提供了一个新的锁对象 Lock * * Lock: void lock(): 获取锁 * void unlock(): 释放锁 * ReentrantLock 是 Lock 的实现类 * */ public class SellTicket implements Runnable { // 定义 100 张票 private static int tickets = 100 ; // 定义锁对象 private Lock lock = new ReentrantLock() ; @Override public void run () { while ( true ){ try { // 加锁 lock .lock() ; if ( tickets > 0 ){ try { Thread. sleep ( 100 ) ; } catch (InterruptedException e) { e.printStackTrace() ; } System. out .println(Thread. currentThread ().getName()+ " 正在出售第 " +( tickets --)+ " 张票 " )

类加载器与Web容器

蓝咒 提交于 2020-04-07 07:48:52
在 关于类加载器 中已经介绍了Jvm的类加载机制,然而对于运行在Java EE容器中的Web应用来说,类加载器的实现方式与一般的Java应用有所不同。不同的Web容器的实现方式也会有所不同。 Tomcat中的类加载机制 在Apache Tomcat 中,为了提高系统的灵活性,引入了commonLoader、sharedLoader、catalinaLoader;为了支持和分隔多个web应用,使用了WebappClassLoader。下面以Tomcat7.0的类加载器结构图总体来看大致如下: Bootstrap | System | Common / \ Webapp1 Webapp2 ... Tomcat中的系统类加载器。Tomcat也是一个Java应用,他也是在最初系统提供的几层类加载器环境下运行起来的。那么Tomcat的一些最基本的类,也和其它简单Java应用一样,是通过系统的类加载器来加载的,比如默认配置下的tomcat/bin目录下的bootstrap.jar、tomcat-juli.jar、commons-daemon.jar这几个jar包中的类。 Tomcat的Common Loader。Common Loader是Tomcat在系统类加载器之上建立起来的,其父loader是系统类加载器。Common Loader负责上面几个jar包外的Tomcat的大部分java类

线程同步详细讲解

社会主义新天地 提交于 2020-04-07 07:35:38
一、什么情况下使用线程同步 很多时候,我们并不知道在什么情况下使用线程同步。在错误的情况下,就会影响性能。在正确的情况下,我们就可以防止程序出现错误。是数据的安全得到保证。 线程同步一般使用在共享数据情况下,就是说共享数据,需要使用线程同步进行保护起来,使数据的安全得到保证。比如:在电子商务中,商品的库存,是共享的数据。 二、Volatile变量 相对于 synchronized 来说,volatile是比较轻量级的线程同步锁。 synchronized 一般使用在函数上。比如: public synchronized int get() {return value;} 而Volatile变量,用来确保将变量的更新操作通知到其它线程。当把变量声明为Volatile类型后,编译器与运行时都会注意到这个变量是共享的。 Volatile变量通常用做某个操作完成、发生中断或者状态的标志。Volatile的语义不足以确保递增操作(count++)的原子性,除非你能确保只有一个线程对变量执行写操作。比如: volatile boolean asleep; while(!asleep) conutSome(); 三、线程封闭 当访问共享的可变数据时,通常需要使用同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程内访问数据,就不需要同步。这种技术被称为线程封闭。 线程封闭技术有两种

Recycleview notifyDataSetChanged()方法调用出现IllegalStateException 问题的解决

半腔热情 提交于 2020-04-07 07:32:45
关于 Android Recycleview notifyDataSetChanged()方法调用出IllegalStateException 问题的解决。 最近写代码使用到了recyclerview,其中界面有一个Checkbox的点击,点击之后是需要刷新界面的相关数据的逻辑的,但是在刷新的时候报了状态异常,个人分析了一下原因:提示说Cannot call this method while RecyclerView is computing a layout or scrolling android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView. Java :1462),RecyclerViewAdapter显然是用一个类似线程的东西写的,我们可以在里面看到很多父类线程的踪影,那么可以分析出出错的原因是因为RecyclerViewAdapter正在更新RecyclerView,也就是调用OnBindViewHolder的时候我们又来调用Notifydatasetchanged方法,这个方法也是刷新界面,最终肯定也是调用OnBindViewHolder,同时调用自然会抛出这个异常,当然,涉及到线程问题,那就肯定涉及到同步跟异步的问题。 解决方法,使用handler类排队

同一进程下的线程可以共享

一世执手 提交于 2020-04-07 05:55:12
同一进程下的线程可以共享以下? ( BD ) A . stack B . data section C . register set D . file fd 线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。 进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括: 1.线程ID 每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标 识线程。 2.寄存器组的值 由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线 程切换到另一个线程上时,必须将原有的线程的寄存器集合的状态保存,以便 将来该线程在被重新切换到时能得以恢复。 3.线程的堆栈 堆栈是保证线程独立运行所必须的。 线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程 必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影 响。 4.错误返回码 由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用 后设置了errno值,而在该线程还没有处理这个错误,另外一个线程就在此时 被调度器投入运行,这样错误值就有可能被修改。 所以,不同的线程应该拥有自己的错误返回码变量。 5.线程的信号屏蔽码