Android开发之路-多线程
多线程作为Android开发中相对而言较为高阶的知识,其中用到相关的知识点是非常的多,所以在我们需要进行设计或者写多线程的代码就必须要进行相对谨慎的处理,这样就由必要对其要有着比较系统化的认知
我们一般将Android应用分成为两种:主线程和工作线程;主线程主要是用来进行初始化UI,而工作线程主要是进行耗时操作,例如读取数据库,网络连接等
Android系统是以进程为单位来对应用程序资源进行限制,这个问题的可以解释为:一个进程最多能够开几个线程?最好能开几个?但实则这个是没有上限这一说,主要是因为资源的限制
Android中关于主线程的理解:Android的主线程是UI线程,在Android中,四大组件运行在主线程中,在主线程中做耗时操作会导致程序出现卡顿甚至出现ANR异常,一个.
在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。
线程总的来就是进程的一个实体,是CPU进行分派和调度的基本单位,拥有着比进程更小且能够独立运行的基本单位,线程本身基本上是不拥有系统资源,仅拥有一点在运行过程中必须拥有的资源,但它可与同属一个进程中的其他进程进行共享其所拥有的所有资源
线程状态有些地方将之分为5中状态,而且在Java Jdk中线程被其定义为6中状态,我们可以对其进行类比
普遍定义的5中状态:新建,就绪,运行,阻塞, 死亡
Java Jdk 定义状态
线程阻塞是指在某一时刻的某一个线程在进行运行一段代码的情况下,突然另一个线程也要进行运行,但在运行过程中,那个线程执行完全运行之前,另一个线程是不可能获取到CPU的执行权,就会导致线路阻塞的出现
死锁也称之为抱死,意思就是说一个进程锁定了另外一个进程所需要的页或表是,但第二个进程同时又锁定了第一个进程所需的一页,这样就会出现死锁现象
简要介绍实现线程的三种方式:继承Thread,实现runnable,实现callable。这里有一点需要注意的是,实现callable是与线程池相关联的而callable很重要的一个特性是其带有返回值。当我们只需实现单线程时实现runnable更加利于线程程序的拓展
在线程开启之前进行调用 thread.setDaemon(true); 将thread设定成当前线程中的守护线程 使用案例
线程让步【yield方法】让当前线程释放CPU资源,让其他线程抢占
这种具体某个对象锁 wait notify 方法与Condition 的 await以及signal方法类似; 全面这种方法的阻塞等待都可以是释放锁,而且在唤醒后,这种线程都是能够获取锁资源的,而这个门栓就跟阀门类似
C语言怎样实现多线程?
首先你要有控制蛇移动方向的全局变量(定义在main以外因为线程函数也要调用它,每次键盘输入都会修改它的值), 比如 char direction ‘a’ ==左 ‘w’ == 右 ‘d’==上 ‘s’ == 下,然后你在移动时应该是在while里面操作的吧,你每移动一步前都读一下direction这个变量的数值然后再控制移动方向(注意s这个键可以忽略因为不会倒着走) 然后你可以用pthread.h这个库 例子是 pthread t;// 定义一个线程 pthread_create(t, null, listen_keyboard_input, null);//建立线程执行listen_keyboard_input这个函数 这个线程执行的函数 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ direction =getchar(); } } 但是这里存在同步问题, 比如当这个线程的getchar()在给direction辅助的同时,你控制贪吃蛇移动的线程正在调用 direction的值来判断下一个移动方向,这就会出问题,所以要加一个锁,叫 mutex lock;这个也定义成全局变量可以使各线程共享。 pthread_mutex_t mutex; //定义一个锁 pthread_mutex_init(mutex, null, null);//初始化 然后把函数修改成 void listen_keyboard_input(){ while(应该通过某个信号来退出这个循环,从而表示游戏结束){ pthread_mutex_lock(mutex); direction =getchar(); pthread_mutex_unlock(mutex); } } 另外一个控制贪吃蛇移动的时候也要加锁 while(…..){ char c; pthread_mutex_lock(mutex); c = direction; pthread_mutex_unlock(mutex); switch(c){ ……………. } …………………………….. } 这样就好了 注意你的控制贪吃蛇移动的部分也必须要放在另外一个pthread 里面执行,如果放在主线程, 主线程会一直等listen_keyboard_input而什么事都不会做 你把这两个线程用 pthread_create 创建完成后 用 t1.join(); t2.join(); 就可以使这两个线程并发执行了 如果你用的是linux 来编译的,你再输入gcc 指令后加上 -lpthread 就可以了 还有什么不懂的你可以多找找 pthread 类的例子
c语言如何编写一个简单的多线程程序?
这是一个多线程例子,里面只有两个线程,是生产者/消费者模式,已编译通过,注释很详细,\x0d\x0a如下:\x0d\x0a\x0d\x0a/* 以生产者和消费者模型问题来阐述Linux线程的控制和通信你 \x0d\x0a 生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。\x0d\x0a 缓冲区有N个,是一个环形的缓冲池。\x0d\x0a */\x0d\x0a#include \x0d\x0a#include \x0d\x0a\x0d\x0a#define BUFFER_SIZE 16\x0d\x0a\x0d\x0astruct prodcons\x0d\x0a{\x0d\x0a int buffer[BUFFER_SIZE];/*实际存放数据的数组*/\x0d\x0a pthread_mutex_t lock;/*互斥体lock,用于对缓冲区的互斥操作*/\x0d\x0a int readpos,writepos; /*读写指针*/\x0d\x0a pthread_cond_t notempty;/*缓冲区非空的条件变量*/\x0d\x0a pthread_cond_t notfull;/*缓冲区未满 的条件变量*/\x0d\x0a};\x0d\x0a\x0d\x0a/*初始化缓冲区*/\x0d\x0avoid pthread_init( struct prodcons *p)\x0d\x0a{\x0d\x0a pthread_mutex_init(p-lock,NULL);\x0d\x0a pthread_cond_init(p-notempty,NULL);\x0d\x0a pthread_cond_init(p-notfull,NULL);\x0d\x0a p-readpos = 0;\x0d\x0a p-writepos = 0;\x0d\x0a}\x0d\x0a\x0d\x0a/*将产品放入缓冲区,这里是存入一个整数*/\x0d\x0avoid put(struct prodcons *p,int data)\x0d\x0a{\x0d\x0a pthread_mutex_lock(p-lock);\x0d\x0a /*等待缓冲区未满*/\x0d\x0a if((p-writepos +1)%BUFFER_SIZE ==p-readpos)\x0d\x0a {\x0d\x0a pthread_cond_wait(p-notfull,p-lock);\x0d\x0a }\x0d\x0a p-buffer[p-writepos] =data;\x0d\x0a p-writepos++;\x0d\x0a if(p-writepos = BUFFER_SIZE)\x0d\x0a p-writepos = 0;\x0d\x0a pthread_cond_signal(p-notempty);\x0d\x0a pthread_mutex_unlock(p-lock);\x0d\x0a}\x0d\x0a/*从缓冲区取出整数*/\x0d\x0aint get(struct prodcons *p)\x0d\x0a{\x0d\x0a int data;\x0d\x0a pthread_mutex_lock(p-lock);\x0d\x0a /*等待缓冲区非空*/\x0d\x0a if(p-writepos == p-readpos)\x0d\x0a {\x0d\x0a pthread_cond_wait(p-notempty ,p-lock);//非空就设置条件变量notempty\x0d\x0a }\x0d\x0a /*读书据,移动读指针*/\x0d\x0a data = p-buffer[p-readpos];\x0d\x0a p-readpos++;\x0d\x0a if(p-readpos == BUFFER_SIZE)\x0d\x0a p-readpos = 0;\x0d\x0a /*设置缓冲区未满的条件变量*/\x0d\x0a pthread_cond_signal(p-notfull);\x0d\x0a pthread_mutex_unlock(p-lock);\x0d\x0a return data;\x0d\x0a}\x0d\x0a /*测试:生产站线程将1 到1000的整数送入缓冲区,消费者线程从缓冲区中获取整数,两者都打印信息*/\x0d\x0a#define OVER (-1)\x0d\x0astruct prodcons buffer;\x0d\x0avoid *producer(void *data)\x0d\x0a{\x0d\x0a int n;\x0d\x0a for( n=0;n\n”,n);\x0d\x0a put(buffer,n);\x0d\x0a }\x0d\x0a put(buffer,OVER);\x0d\x0a return NULL;\x0d\x0a}\x0d\x0avoid *consumer(void *data)\x0d\x0a{\x0d\x0a int d;\x0d\x0a while(1)\x0d\x0a {\x0d\x0a d = get(buffer);\x0d\x0a if(d == OVER)\x0d\x0a break;\x0d\x0a else\x0d\x0a printf(“—–%d\n”,d);\x0d\x0a }\x0d\x0a return NULL;\x0d\x0a}\x0d\x0aint main()\x0d\x0a{\x0d\x0a pthread_t th_p,th_c;\x0d\x0a void *retval;\x0d\x0a pthread_init(buffer);\x0d\x0a pthread_create(th_p,NULL,producer,0);\x0d\x0a pthread_create(th_c,NULL,consumer,0);\x0d\x0a /*等待两个线程结束*/\x0d\x0a pthread_join(th_p, retval);\x0d\x0a pthread_join(th_c,retval);\x0d\x0a return 0;\x0d\x0a}