用于线程处理的类都有哪些
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于线程处理的类都有哪些相关的知识,希望对你有一定的参考价值。
(1)fork系统调用fork,vfork,clone都是linux的系统调用,用来创建子进程的(确切说vfork创造出来的是线程)。
下面先来看一看进程必须的几个要点。
要有一段程序供该进程运行,就像一场戏剧要有一个剧本一样。该程序是可以被多个进程共享的,多场戏剧用一个剧本一样。
有起码的私有财产,就是进程专用的系统堆栈空间。
有“户口”,既操作系统所说的进程控制块,在linux中具体实现是task_struct
有独立的存储空间。
当一个进程缺少d条件时候,我们称其为线程。
注:Fork系统调用创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容(两个进程的pid不同)。这里是资源的复制不是指针的复制。
(2)vfork系统调用
vfork创建出来的不是真正意义上的进程,而是一个线程,因为它缺少了我们上面提到的进程的四要素的第4项,独立的内存资源。另外由vfork创造出来的子进程还会导致父进程挂起,除非子进程exit或者execve才会唤起父进程。
(3)clone系统调用
clone函数功能强大,带了众多参数,因此由clone创建的进程要比前面两种方法复杂。clone可以让你有选择性的继承父进程的资源,你可以选择像vfork一样和父进程共享一个虚存空间,从而使创造的是线程,你也可以不和父进程共享,你甚至可以选择创造出来的进程和父进程不再是父子关系,而是兄弟关系。先有必要说下这个函数的结构
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
这里fn是函数指针,我们知道进程的4要素,这个就是指向程序的指针,就是所谓的“剧本", child_stack明显是为子进程分配系统堆栈空间(在linux下系统堆栈空间是2页面,就是8K的内存,其中在这块内存中,低地址上放入了值,这个值就是进程控制块task_struct的值),flags就是标志用来描述你需要从父进程继承那些资源, arg就是传给子进程的参数)。下面是flags可以取的值
标志 含义
CLONE_PARENT 创建的子进程的父进程是调用者的父进程,新进程与创建它的进程成了“兄弟”而不是“父子”
CLONE_FS 子进程与父进程共享相同的文件系统,包括root、当前目录、umask
CLONE_FILES 子进程与父进程共享相同的文件描述符(file descriptor)表
CLONE_NEWNS 在新的namespace启动子进程,namespace描述了进程的文件hierarchy
CLONE_SIGHAND 子进程与父进程共享相同的信号处理(signal handler)表
CLONE_PTRACE 若父进程被trace,子进程也被trace
CLONE_VFORK 父进程被挂起,直至子进程释放虚拟内存资源
CLONE_VM 子进程与父进程运行于相同的内存空间
CLONE_PID 子进程在创建时PID与父进程一致
CLONE_THREAD Linux 2.4中增加以支持POSIX线程标准,子进程与父进程共享相同的线程群.。
(4)linux线程
pthread_create()
这个函数创建一个线程,原型如下:
#include <pthread.h>
int pthread_create (pthread_t *thread, pthread_attr_t *attr,\
void * (*start_routine) (void *), void *arg);
一共需要四个参数传递给 pthread_create 函数,调用成功返回 0,否则返回其他值。
线程标识符
这是第一个参数,是一个指针,指向一个 pthread_t 类型的数据。创建一个线程的时候,这个指针指向的变量里面会被写入一个标识符,以后可以通过这个标识符来引用此线程。
线程属性
第二个参数设置线程的属性,通常可以传递 NULL 给这个参数。
执行函数
第三个参数就是本线程要执行的函数,这是一个函数指针,这个函数的形参可以是任何类型的指针(void ),返回值也可以是任何类型的指针 (void )。
传递给执行函数的参数
第四个参数是一个指向任意类型的指针,传递给第三个参数作为参数。
pthread_exit()
pthread_exit() 用于线程退出,可以指定返回值,以便其他线程通过 pthread_join() 函数获取该线程的返回值。 return ,是函数返回,不一定是线程函数! 只有线程函数 return,线程才会退出 exit() 是进程退出,如果在线程函数中调用 exit ,那此线程的进程也就挂了。会导致该线程所在进程的其他线程也挂掉,比较严重。
#include <pthread.h>
void pthread_exit ( void *retval );
pthread_join()
相当于进程中的 wait() 函数,第一个参数是要等待的线程,它是用 pthread_create() 创建的线程标识符。第二个参数是一个指针,这个指针指向线程的返回值。成功返回0,出错返回错误代码。
#include <pthread.h>
int pthread_join (pthread_t th, void **thread_return); 参考技术A 线程就是 继承Thread类 或实现Runnable结果
在run方法里面写上你要做的事就是了 参考技术B 12
实现默认 Android 软键盘的类都有哪些?
【中文标题】实现默认 Android 软键盘的类都有哪些?【英文标题】:What are the classes that implement the default Android soft keyboards?实现默认 Android 软键盘的类有哪些? 【发布时间】:2021-08-29 11:21:36 【问题描述】:实现默认 Android 软键盘的类是什么,当您使用 android:inputType="text"
或其他可能的 android:inputType 值定义 EditText
时获得的类?
(我想看看这些类是如何工作的,向它们引入一些额外的功能。)
我发现键盘不是我Activity
的一部分,而且键盘的OnTouch事件不经过Activity.dispatchTouchEvent(..)
。
这与the documentation 一致,即键盘在服务中运行,显然意味着它在不同的线程中运行,并且不属于包含EditText
元素的Activity
的一部分。
还说这个服务是由InputMethodService
实现的。
我希望通过在InputMethodService
的各个地方设置断点来找到这些类,包括它的onCreate(..)
方法。这些断点均未命中。
所以我没办法上这些课程。
有什么帮助吗?
谢谢
【问题讨论】:
【参考方案1】:InputMethodService 是所有软键盘的基类。但是没有默认的软键盘。每个都是自己完全独立的应用程序。每个 OEM 都独立决定使用哪个应用程序。
这就是你的断点失败的原因——因为断点需要放在不同的应用程序(键盘应用程序)中。在 EditableInputConnection 中放置断点会更幸运,它是 TextView 和 EditView 两个应用程序之间通信桥梁的实现。
如果您有兴趣查看代码,请查看https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/refs/heads/master 这是 Google 的基本键盘。它可以向您展示事情是如何工作的,但 IIRC 并不是为了可读性而编写的。当然,我写键盘已经 8 年了,也许它变得更好了。 InputMethodService 的直接链接是https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/refs/heads/master/java/src/com/android/inputmethod/latin/LatinIME.java
【讨论】:
以上是关于用于线程处理的类都有哪些的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Bootstrap实现分页及翻页?Bootstrap实现分页的类都有哪些