如何破解myeclipse8.6如何破解经典版本8.5,8.6

您所在的位置: &
线程睡眠:Thread.sleep()方法
线程睡眠:Thread.sleep()方法
电子工业出版社
《Java逍遥游记》第19章多线程(上篇),本章首先介绍Java线程的运行机制,然后介绍线程的创建与启动方法,接着介绍Java虚拟机如何对多个线程进行调度,以及如何在程序中干预Java虚拟机对线程的调度过程。本节为大家介绍线程睡眠:Thread.sleep()方法。
19.4.2& 线程睡眠:Thread.sleep()方法
当一个线程在运行中执行了sleep()方法,它就会放弃CPU,转到阻塞状态。下面对19.2.1节的例程19-4的Monkey类的fight()方法做如下修改,使小悟空线程每次打败一个敌人后,就休息500毫秒:public&void&fight(){&/*&与敌人战斗&*/ &&&for(int&i=1;i=100;i++){ &&&&&System.out.println(getName()+":打败第"+i+"个敌人"); &&&&&&try{ &&&&&&&sleep(500);&//睡眠500毫秒 &&&&&}catch(InterruptedException&e){ &&&&&&&throw&new&RuntimeException(e); &&&&&} &&&&} &}&
Thread类的sleep(long millis)方法是静态方法,millis参数设定睡眠的时间,以毫秒为单位。
再次运行19.2.1节的例程19-5的War类时,假定某一时刻m1线程获得CPU,开始执行一次for循环,当它执行sleep()方法时,就会放弃CPU并开始睡眠。接着m2线程获得CPU,开始执行一次for循环,当它执行sleep()方法时,就会放弃CPU并开始睡眠。接着m3线程获得CPU,开始执行一次for循环,当它执行sleep()方法时,就会放弃CPU并开始睡眠。假定此时m1线程已经结束睡眠,就会获得CPU,继续执行下一次for循环。
再次运行War程序,一种可能的打印结果如下:第1个小悟空:打败第1个敌人 &第2个小悟空:打败第1个敌人 &第3个小悟空:打败第1个敌人 &第1个小悟空:打败第2个敌人 &第2个小悟空:打败第2个敌人 &第3个小悟空:打败第2个敌人 &第1个小悟空:打败第3个敌人 &第2个小悟空:打败第3个敌人 &第3个小悟空:打败第3个敌人 &……&
值得注意的是,当m1线程结束睡眠,首先转到就绪状态,假如此时CPU正被m2线程占用,那么m1线程不一定立即会运行,而是在可运行池中等待获得CPU。
【责任编辑: TEL:(010)】&&&&&&
关于&&的更多文章
又是一周匆匆而过。上周五、周六两天,2013年51CTO云计算架构师
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
解释ASP.NET MVC框架与"文件页"Web框架的不同之处
本书以Android 4.X进行开发示范,通过大量图示与step
本书手把手地教读者用C语言制作两种编程语言:crowbar
本书结合大量的典型实例,详细介绍了用Java来编写网络应用程序的技术。本书的范例都基于最新的JDK 1.5版本,书中内容包括:Java
51CTO旗下网站例子详细解析:
一.&pthread_create()与pthread_join()函数
1 #include &pthread.h&
2 int pthread_join(pthread_t thread,
void **retval);
1. pthread_join函数作用
&& pthread_join函数作用是在一个线程中以阻塞的方式等待另一个线程(线程标识符为thread)的退出。如果等待的进程已经结束,那么该函数会立即返回。
&&& retval是用户定义的指针,用来存储被等待线程的返回值。
&&& 返回值: 0 -- 成功,失败 -- 错误号errno
2. pthread_join的应用
&&& 使一个线程等待另一个线程的结束
&&& 代码中如果没有pthread_join主线程会很快结束,从而从而合整个进程线束,从而使创建的线程没有机会执行就结束了,在主线程加入pthread_join后,主线程会阻塞等待直到(被等待的)线程结束后,主线程自己才结束,从而使创建的线程有机会执行
3. 一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用 pthread_join 的线程则返回错误代码ESRCH。
1 #include &pthread.h&
2 int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg);
1.&pthread_create函数的作用
&& 创建一个线程,成功时返回0,错误时返回errno。
&& thread:被创建线程的标识符,pthread_join使用这个标识符来等待该线程的结束。
&& attr:&&&& 设置线程的属性,可以为NULL
&& 第三个参数是线程函数的入口地址
&& arg:&&&&&&传递给线程的参数,当要传递给线程的参数有多个时,可以使用结构体.
#ifdef HAVE_CONFIG_H
#include &config.h&
#include &stdio.h&
#include &stdlib.h&
#include &pthread.h&
#include &string.h&
// 参数结构体
struct argument
char string[30];
// 声明两个线程函数
void *thread1_func( void * );
void *thread2_func( void * );
int main(int argc, char *argv[])
//定义两个线程标识符
pthread_t thread1, thread2;
//定义用来接收两个线程退出后的返回值,用作pthread_join的第二个参数
void *thread1_return, *thread2_
//传递的参数结构体
struct argument arg1, arg2;
int wait_thread_ //判断线程退出成功与否
//参数结构体值初始化
arg1.num = 1949;
strcpy( arg1.string, "中华人民共和国" );
arg2.num = 2012;
strcpy( arg2.string, "建国63周年" );
// 创建两个线程
pthread_create(&thread1, NULL, thread1_func, (void*)&arg1 );
pthread_create( &thread2, NULL, thread2_func, (void*)&arg2 );
for( i = 0; i & 2; i++ )
printf("我是最初的进程!\n");
//主统线程睡眠,调用其他线程
//等待第一个线程退出,并接收它的返回值(返回值存储在thread1_return)
wait_thread_end = pthread_join( thread1, &thread1_return );
if( wait_thread_end != 0 )
printf("调用 pthread_join 获取线程1的返回值出现错误!\n");
printf("调用 pthread_join 成功!线程1退出后的返回值是 %d\n", (int)thread1_return);
//等待第二个线程退出,并接收它的返回值(返回值存储在thread2_return)
wait_thread_end = pthread_join( thread2, &thread2_return);
if( wait_thread_end != 0 )
printf("调用 pthread_join 获取线程2的返回值出现错误!\n");
printf("调用 pthread_join 成功!线程2退出后的返回值是 %d\n",(int)thread2_return );
return EXIT_SUCCESS;
*线程1函数实现
void *thread1_func( void *arg )
struct argument *arg_thread1; // 接收传递过来的参数结构体
arg_thread1 = ( struct argument * )
for( i = 0; i & 3; i++)
printf( "我来自线程1,传递给我的参数是 %d, %s\n", arg_thread1-&num, arg_thread1-&string);
sleep(2); // 投入睡眠,调用其它线程
return (void *)123;
void *thread2_func( void *arg )
struct argument *arg_thread2; // 接收传递过来的参数结构体
arg_thread2 = ( struct argument * )
for( i = 0; i & 3; i++)
printf( "我来自线程2,传递给我的参数是 %d, %s\n", arg_thread2-&num, arg_thread2-&string);
sleep(2); // 投入睡眠,调用其它线程
return (void *)456;
例子中要请注意的地方:
&void *thread1_func( void *arg )
&&& return (void*)123;
&& void *thread2_func( void *arg )
&&& return (void*)456;
1. 在线程函数中thread1_func()和thread2_func()中,最后一句return语句中,对返回的值要进行类型转换(转换成(void *)),返回值的类型要与线程函数的声明和定义的返回值类型一致。
2.&&两个线程函数的返回值均为一个指针(把一个整数转换成(void*)返回)。该指针存储在pthread_join()的第三个参数中,在这两个函数中等价于
&&& &thread1_return = thread1_func((void*)&arg1);
&& &thread2_return = thread2_func((void*)&arg2);
&& 其中,&thread1_return是pthread_join的第二个参数,在前面函数解析中说过,pthread_join(phtread_t thread, void **retval)函数的第二个参数retval可以存储线程的返回值。该返回值直接存储在&thread1_return和&thread2_return,此时thread1_return和thread2_return值就是线程1和线程2函数的返回值(void *)类型。所以(int)thread1_return和(int)thread2_return就是该函数的返回值内容。由定义(void *thread1_return, *thread2_return)可以看出,thread1_return和thread2_return中两个指针,也就是说,这两个指针所存储的地址已经被两个线程的返回值所覆盖。
阅读(...) 评论() &60209人阅读
IOS开发(47)
解决线程阻塞问题&多线程并发&线程状态&扩展-NSObject分类扩展&
NSInvocationOperation&NSBlockOperation&线程执行顺序&
串行队列&并发队列&其他任务执行方法&
NSLock同步锁&@synchronized代码块&扩展--使用GCD解决资源抢占问题&扩展--控制线程通信&
NSThread实现多线程
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &KCMainViewController.h&
@interface KCMainViewController (){
UIImageView *_imageV
@implementation KCMainViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self layoutUI];
#pragma mark 界面布局
-(void)layoutUI{
_imageView =[[UIImageView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame];
_imageView.contentMode=UIViewContentModeScaleAspectF
[self.view addSubview:_imageView];
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame=CGRectMake(50, 500, 220, 25);
[button setTitle:@&加载图片& forState:UIControlStateNormal];
//添加方法
[button addTarget:self action:@selector(loadImageWithMultiThread) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
#pragma mark 将图片显示到界面
-(void)updateImage:(NSData *)imageData{
UIImage *image=[UIImage imageWithData:imageData];
_imageView.image=
#pragma mark 请求图片数据
-(NSData *)requestData{
//对于多线程操作建议把线程操作放到@autoreleasepool中
@autoreleasepool {
NSURL *url=[NSURL URLWithString:@&/iphone-6/overview/images/biggest_right_large.png&];
NSData *data=[NSData dataWithContentsOfURL:url];
#pragma mark 加载图片
-(void)loadImage{
//请求数据
NSData *data= [self requestData];
/*将数据显示到UI控件,注意只能在主线程中更新UI,
另外performSelectorOnMainThread方法是NSObject的分类方法,每个NSObject对象都有此方法,
它调用的selector方法是当前调用控件的方法,例如使用UIImageView调用的时候selector就是UIImageView的方法
Object:代表调用方法的参数,不过只能传递一个参数(如果有多个参数请使用对象进行封装)
waitUntilDone:是否线程任务完成执行
[self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];
#pragma mark 多线程下载图片
-(void)loadImageWithMultiThread{
//方法1:使用对象方法
//创建一个线程,第一个参数是请求的操作,第二个参数是操作方法的参数
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
//启动一个线程,注意启动一个线程并非就一定立即执行,而是处于就绪状态,当系统调度时才真正执行
[thread start];
//方法2:使用类方法
[NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
KCImageData.h
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &Foundation/Foundation.h&
@interface KCImageData : NSObject
#pragma mark 索引
@property (nonatomic,assign) int
#pragma mark 图片数据
@property (nonatomic,strong) NSData *
NSThread实现多线程
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &KCMainViewController.h&
#import &KCImageData.h&
#define ROW_COUNT 5
#define COLUMN_COUNT 3
#define ROW_HEIGHT 100
#define ROW_WIDTH ROW_HEIGHT
#define CELL_SPACING 10
@interface KCMainViewController (){
NSMutableArray *_imageV
@implementation KCMainViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self layoutUI];
#pragma mark 界面布局
-(void)layoutUI{
//创建多个图片控件用于显示图片
_imageViews=[NSMutableArray array];
for (int r=0; r&ROW_COUNT; r++) {
for (int c=0; c&COLUMN_COUNT; c++) {
UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(c*ROW_WIDTH+(c*CELL_SPACING), r*ROW_HEIGHT+(r*CELL_SPACING
), ROW_WIDTH, ROW_HEIGHT)];
imageView.contentMode=UIViewContentModeScaleAspectF
imageView.backgroundColor=[UIColor redColor];
[self.view addSubview:imageView];
[_imageViews addObject:imageView];
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame=CGRectMake(50, 500, 220, 25);
[button setTitle:@&加载图片& forState:UIControlStateNormal];
//添加方法
[button addTarget:self action:@selector(loadImageWithMultiThread) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
#pragma mark 将图片显示到界面
-(void)updateImage:(KCImageData *)imageData{
UIImage *image=[UIImage imageWithData:imageData.data];
UIImageView *imageView= _imageViews[imageData.index];
imageView.image=
#pragma mark 请求图片数据
-(NSData *)requestData:(int )index{
//对于多线程操作建议把线程操作放到@autoreleasepool中
@autoreleasepool {
NSURL *url=[NSURL URLWithString:@&/iphone-6/overview/images/biggest_right_large.png&];
NSData *data=[NSData dataWithContentsOfURL:url];
#pragma mark 加载图片
-(void)loadImage:(NSNumber *)index{
NSLog(@&%i&,i);
//currentThread方法可以取得当前操作线程
NSLog(@&current thread:%@&,[NSThread currentThread]);
int i=[index integerValue];
NSLog(@&%i&,i);//未必按顺序输出
NSData *data= [self requestData:i];
KCImageData *imageData=[[KCImageData alloc]init];
imageData.index=i;
imageData.data=
[self performSelectorOnMainThread:@selector(updateImage:) withObject:imageData waitUntilDone:YES];
#pragma mark 多线程下载图片
-(void)loadImageWithMultiThread{
//创建多个线程用于填充图片
for (int i=0; i&ROW_COUNT*COLUMN_COUNT; ++i) {
[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:[NSNumber numberWithInt:i]];
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage:) object:[NSNumber numberWithInt:i]];
thread.name=[NSString stringWithFormat:@&myThread%i&,i];//设置线程名称
[thread start];
-(void)loadImageWithMultiThread{
NSMutableArray *threads=[NSMutableArray array];
int count=ROW_COUNT*COLUMN_COUNT;
//创建多个线程用于填充图片
for (int i=0; i& ++i) {
[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:[NSNumber numberWithInt:i]];
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage:) object:[NSNumber numberWithInt:i]];
thread.name=[NSString stringWithFormat:@&myThread%i&,i];//设置线程名称
if(i==(count-1)){
thread.threadPriority=1.0;
thread.threadPriority=0.0;
[threads addObject:thread];
for (int i=0; i& i++) {
NSThread *thread=threads[i];
[thread start];
-(NSData *)requestData:(int )index{
//对于多线程操作建议把线程操作放到@autoreleasepool中
@autoreleasepool {
//对非最后一张图片加载线程休眠2秒
if (index!=(ROW_COUNT*COLUMN_COUNT-1)) {
[NSThread sleepForTimeInterval:2.0];
NSURL *url=[NSURL URLWithString:_imageNames[index]];
NSData *data=[NSData dataWithContentsOfURL:url];
NSThread实现多线程
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &KCMainViewController.h&
#import &KCImageData.h&
#define ROW_COUNT 5
#define COLUMN_COUNT 3
#define ROW_HEIGHT 100
#define ROW_WIDTH ROW_HEIGHT
#define CELL_SPACING 10
@interface KCMainViewController (){
NSMutableArray *_imageV
NSMutableArray *_imageN
NSMutableArray *_
@implementation KCMainViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self layoutUI];
#pragma mark 界面布局
-(void)layoutUI{
//创建多个图片空间用于显示图片
_imageViews=[NSMutableArray array];
for (int r=0; r&ROW_COUNT; r++) {
for (int c=0; c&COLUMN_COUNT; c++) {
UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(c*ROW_WIDTH+(c*CELL_SPACING), r*ROW_HEIGHT+(r*CELL_SPACING
), ROW_WIDTH, ROW_HEIGHT)];
imageView.contentMode=UIViewContentModeScaleAspectF
imageView.backgroundColor=[UIColor redColor];
[self.view addSubview:imageView];
[_imageViews addObject:imageView];
//加载按钮
UIButton *buttonStart=[UIButton buttonWithType:UIButtonTypeRoundedRect];
buttonStart.frame=CGRectMake(50, 500, 100, 25);
[buttonStart setTitle:@&加载图片& forState:UIControlStateNormal];
[buttonStart addTarget:self action:@selector(loadImageWithMultiThread) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:buttonStart];
//停止按钮
UIButton *buttonStop=[UIButton buttonWithType:UIButtonTypeRoundedRect];
buttonStop.frame=CGRectMake(160, 500, 100, 25);
[buttonStop setTitle:@&停止加载& forState:UIControlStateNormal];
[buttonStop addTarget:self action:@selector(stopLoadImage) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:buttonStop];
//创建图片链接
_imageNames=[NSMutableArray array];
[_imageNames addObject:@
for (int i=0; i&IMAGE_COUNT; i++) {
[_imageNames addObject:[NSString stringWithFormat:@&/cnblogs_com/kenshincui/613474/o_%i.jpg&,i]];
#pragma mark 将图片显示到界面
-(void)updateImage:(KCImageData *)imageData{
UIImage *image=[UIImage imageWithData:imageData.data];
UIImageView *imageView= _imageViews[imageData.index];
imageView.image=
#pragma mark 请求图片数据
-(NSData *)requestData:(int )index{
//对于多线程操作建议把线程操作放到@autoreleasepool中
@autoreleasepool {
NSURL *url=[NSURL URLWithString:_imageNames[index]];
NSData *data=[NSData dataWithContentsOfURL:url];
#pragma mark 加载图片
-(void)loadImage:(NSNumber *)index{
int i=[index integerValue];
NSData *data= [self requestData:i];
NSThread *currentThread=[NSThread currentThread];
如果当前线程处于取消状态,则退出当前线程
if (currentThread.isCancelled) {
NSLog(@&thread(%@) will be cancelled!&,currentThread);
[NSThread exit];//取消当前线程
KCImageData *imageData=[[KCImageData alloc]init];
imageData.index=i;
imageData.data=
[self performSelectorOnMainThread:@selector(updateImage:) withObject:imageData waitUntilDone:YES];
#pragma mark 多线程下载图片
-(void)loadImageWithMultiThread{
int count=ROW_COUNT*COLUMN_COUNT;
_threads=[NSMutableArray arrayWithCapacity:count];
//创建多个线程用于填充图片
for (int i=0; i& ++i) {
NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage:) object:[NSNumber numberWithInt:i]];
thread.name=[NSString stringWithFormat:@&myThread%i&,i];//设置线程名称
[_threads addObject:thread];
//循环启动线程
for (int i=0; i& ++i) {
NSThread *thread= _threads[i];
[thread start];
#pragma mark 停止加载图片
-(void)stopLoadImage{
for (int i=0; i&ROW_COUNT*COLUMN_COUNT; i++) {
NSThread *thread= _threads[i];
//判断线程是否完成,如果没有完成则设置为取消状态
//注意设置为取消状态仅仅是改变了线程状态而言,并不能终止线程
if (!thread.isFinished) {
[thread cancel];
-(void)loadImageWithMultiThread{
int count=ROW_COUNT*COLUMN_COUNT;
for (int i=0; i& ++i) {
[self performSelectorInBackground:@selector(loadImage:) withObject:[NSNumber numberWithInt:i]];
-(void)loadImageWithMultiThread{
/*创建一个调用操作
object:调用方法参数
NSInvocationOperation *invocationOperation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
//创建完NSInvocationOperation对象并不会调用,它由一个start方法启动操作,但是注意如果直接调用start方法,则此操作会在主线程中调用,一般不会这么操作,而是添加到NSOperationQueue中
[invocationOperation start];
//创建操作队列
NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init];
//注意添加到操作队后,队列会开启一个线程执行此操作
[operationQueue addOperation:invocationOperation];
NSOperation实现多线程
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &KCMainViewController.h&
#import &KCImageData.h&
#define ROW_COUNT 5
#define COLUMN_COUNT 3
#define ROW_HEIGHT 100
#define ROW_WIDTH ROW_HEIGHT
#define CELL_SPACING 10
@interface KCMainViewController (){
NSMutableArray *_imageV
NSMutableArray *_imageN
@implementation KCMainViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self layoutUI];
#pragma mark 界面布局
-(void)layoutUI{
//创建多个图片控件用于显示图片
_imageViews=[NSMutableArray array];
for (int r=0; r&ROW_COUNT; r++) {
for (int c=0; c&COLUMN_COUNT; c++) {
UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(c*ROW_WIDTH+(c*CELL_SPACING), r*ROW_HEIGHT+(r*CELL_SPACING
), ROW_WIDTH, ROW_HEIGHT)];
imageView.contentMode=UIViewContentModeScaleAspectF
imageView.backgroundColor=[UIColor redColor];
[self.view addSubview:imageView];
[_imageViews addObject:imageView];
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame=CGRectMake(50, 500, 220, 25);
[button setTitle:@&加载图片& forState:UIControlStateNormal];
//添加方法
[button addTarget:self action:@selector(loadImageWithMultiThread) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
//创建图片链接
_imageNames=[NSMutableArray array];
for (int i=0; i&IMAGE_COUNT; i++) {
[_imageNames addObject:[NSString stringWithFormat:@&/cnblogs_com/kenshincui/613474/o_%i.jpg&,i]];
#pragma mark 将图片显示到界面
-(void)updateImageWithData:(NSData *)data andIndex:(int )index{
UIImage *image=[UIImage imageWithData:data];
UIImageView *imageView= _imageViews[index];
imageView.image=
#pragma mark 请求图片数据
-(NSData *)requestData:(int )index{
//对于多线程操作建议把线程操作放到@autoreleasepool中
@autoreleasepool {
NSURL *url=[NSURL URLWithString:_imageNames[index]];
NSData *data=[NSData dataWithContentsOfURL:url];
#pragma mark 加载图片
-(void)loadImage:(NSNumber *)index{
int i=[index integerValue];
//请求数据
NSData *data= [self requestData:i];
NSLog(@&%@&,[NSThread currentThread]);
//更新UI界面,此处调用了主线程队列的方法(mainQueue是UI主线程)
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self updateImageWithData:data andIndex:i];
#pragma mark 多线程下载图片
-(void)loadImageWithMultiThread{
int count=ROW_COUNT*COLUMN_COUNT;
//创建操作队列
NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init];
operationQueue.maxConcurrentOperationCount=5;//设置最大并发线程数
//创建多个线程用于填充图片
for (int i=0; i& ++i) {
//方法1:创建操作块添加到队列
//创建多线程操作
NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
[self loadImage:[NSNumber numberWithInt:i]];
//创建操作队列
[operationQueue addOperation:blockOperation];
//方法2:直接使用操队列添加操作
[operationQueue addOperationWithBlock:^{
[self loadImage:[NSNumber numberWithInt:i]];
-(void)loadImageWithMultiThread{
int count=ROW_COUNT*COLUMN_COUNT;
//创建操作队列
NSOperationQueue *operationQueue=[[NSOperationQueue alloc]init];
operationQueue.maxConcurrentOperationCount=5;//设置最大并发线程数
NSBlockOperation *lastBlockOperation=[NSBlockOperation blockOperationWithBlock:^{
[self loadImage:[NSNumber numberWithInt:(count-1)]];
//创建多个线程用于填充图片
for (int i=0; i&count-1; ++i) {
//方法1:创建操作块添加到队列
//创建多线程操作
NSBlockOperation *blockOperation=[NSBlockOperation blockOperationWithBlock:^{
[self loadImage:[NSNumber numberWithInt:i]];
//设置依赖操作为最后一张图片加载操作
[blockOperation addDependency:lastBlockOperation];
[operationQueue addOperation:blockOperation];
//将最后一个图片的加载操作加入线程队列
[operationQueue addOperation:lastBlockOperation];
GCD实现多线程
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &KCMainViewController.h&
#import &KCImageData.h&
#define ROW_COUNT 5
#define COLUMN_COUNT 3
#define ROW_HEIGHT 100
#define ROW_WIDTH ROW_HEIGHT
#define CELL_SPACING 10
@interface KCMainViewController (){
NSMutableArray *_imageV
NSMutableArray *_imageN
@implementation KCMainViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self layoutUI];
#pragma mark 界面布局
-(void)layoutUI{
//创建多个图片控件用于显示图片
_imageViews=[NSMutableArray array];
for (int r=0; r&ROW_COUNT; r++) {
for (int c=0; c&COLUMN_COUNT; c++) {
UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(c*ROW_WIDTH+(c*CELL_SPACING), r*ROW_HEIGHT+(r*CELL_SPACING
), ROW_WIDTH, ROW_HEIGHT)];
imageView.contentMode=UIViewContentModeScaleAspectF
imageView.backgroundColor=[UIColor redColor];
[self.view addSubview:imageView];
[_imageViews addObject:imageView];
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame=CGRectMake(50, 500, 220, 25);
[button setTitle:@&加载图片& forState:UIControlStateNormal];
//添加方法
[button addTarget:self action:@selector(loadImageWithMultiThread) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
//创建图片链接
_imageNames=[NSMutableArray array];
for (int i=0; i&ROW_COUNT*COLUMN_COUNT; i++) {
[_imageNames addObject:[NSString stringWithFormat:@&/cnblogs_com/kenshincui/613474/o_%i.jpg&,i]];
#pragma mark 将图片显示到界面
-(void)updateImageWithData:(NSData *)data andIndex:(int )index{
UIImage *image=[UIImage imageWithData:data];
UIImageView *imageView= _imageViews[index];
imageView.image=
#pragma mark 请求图片数据
-(NSData *)requestData:(int )index{
NSURL *url=[NSURL URLWithString:_imageNames[index]];
NSData *data=[NSData dataWithContentsOfURL:url];
#pragma mark 加载图片
-(void)loadImage:(NSNumber *)index{
//如果在串行队列中会发现当前线程打印变化完全一样,因为他们在一个线程中
NSLog(@&thread is :%@&,[NSThread currentThread]);
int i=[index integerValue];
//请求数据
NSData *data= [self requestData:i];
//更新UI界面,此处调用了GCD主线程队列的方法
dispatch_queue_t mainQueue= dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
[self updateImageWithData:data andIndex:i];
#pragma mark 多线程下载图片
-(void)loadImageWithMultiThread{
int count=ROW_COUNT*COLUMN_COUNT;
/*创建一个串行队列
第一个参数:队列名称
第二个参数:队列类型
dispatch_queue_t serialQueue=dispatch_queue_create(&myThreadQueue1&, DISPATCH_QUEUE_SERIAL);//注意queue对象不是指针类型
//创建多个线程用于填充图片
for (int i=0; i& ++i) {
//异步执行队列任务
dispatch_async(serialQueue, ^{
[self loadImage:[NSNumber numberWithInt:i]];
//非ARC环境请释放
dispatch_release(seriQueue);
-(void)loadImageWithMultiThread{
int count=ROW_COUNT*COLUMN_COUNT;
/*取得全局队列
第一个参数:线程优先级
第二个参数:标记参数,目前没有用,一般传入0
dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建多个线程用于填充图片
for (int i=0; i& ++i) {
//异步执行队列任务
dispatch_async(globalQueue, ^{
[self loadImage:[NSNumber numberWithInt:i]];
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &KCMainViewController.h&
#import &KCImageData.h&
#define ROW_COUNT 5
#define COLUMN_COUNT 3
#define ROW_HEIGHT 100
#define ROW_WIDTH ROW_HEIGHT
#define CELL_SPACING 10
#define IMAGE_COUNT 9
@interface KCMainViewController (){
NSMutableArray *_imageV
NSMutableArray *_imageN
@implementation KCMainViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self layoutUI];
#pragma mark 界面布局
-(void)layoutUI{
//创建多个图片控件用于显示图片
_imageViews=[NSMutableArray array];
for (int r=0; r&ROW_COUNT; r++) {
for (int c=0; c&COLUMN_COUNT; c++) {
UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(c*ROW_WIDTH+(c*CELL_SPACING), r*ROW_HEIGHT+(r*CELL_SPACING
), ROW_WIDTH, ROW_HEIGHT)];
imageView.contentMode=UIViewContentModeScaleAspectF
imageView.backgroundColor=[UIColor redColor];
[self.view addSubview:imageView];
[_imageViews addObject:imageView];
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame=CGRectMake(50, 500, 220, 25);
[button setTitle:@&加载图片& forState:UIControlStateNormal];
//添加方法
[button addTarget:self action:@selector(loadImageWithMultiThread) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
//创建图片链接
_imageNames=[NSMutableArray array];
for (int i=0; i&IMAGE_COUNT; i++) {
[_imageNames addObject:[NSString stringWithFormat:@&/cnblogs_com/kenshincui/613474/o_%i.jpg&,i]];
#pragma mark 将图片显示到界面
-(void)updateImageWithData:(NSData *)data andIndex:(int )index{
UIImage *image=[UIImage imageWithData:data];
UIImageView *imageView= _imageViews[index];
imageView.image=
#pragma mark 请求图片数据
-(NSData *)requestData:(int )index{
NSString *
if (_imageNames.count&0) {
name=[_imageNames lastObject];
[_imageNames removeObject:name];
NSURL *url=[NSURL URLWithString:name];
data=[NSData dataWithContentsOfURL:url];
#pragma mark 加载图片
-(void)loadImage:(NSNumber *)index{
int i=[index integerValue];
//请求数据
NSData *data= [self requestData:i];
//更新UI界面,此处调用了GCD主线程队列的方法
dispatch_queue_t mainQueue= dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
[self updateImageWithData:data andIndex:i];
#pragma mark 多线程下载图片
-(void)loadImageWithMultiThread{
int count=ROW_COUNT*COLUMN_COUNT;
dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建多个线程用于填充图片
for (int i=0; i& ++i) {
//异步执行队列任务
dispatch_async(globalQueue, ^{
[self loadImage:[NSNumber numberWithInt:i]];
KCMainViewController.h
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &UIKit/UIKit.h&
@interface KCMainViewController : UIViewController
@property (atomic,strong) NSMutableArray *imageN
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &KCMainViewController.h&
#import &KCImageData.h&
#define ROW_COUNT 5
#define COLUMN_COUNT 3
#define ROW_HEIGHT 100
#define ROW_WIDTH ROW_HEIGHT
#define CELL_SPACING 10
#define IMAGE_COUNT 9
@interface KCMainViewController (){
NSMutableArray *_imageV
@implementation KCMainViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self layoutUI];
#pragma mark 界面布局
-(void)layoutUI{
//创建多个图片控件用于显示图片
_imageViews=[NSMutableArray array];
for (int r=0; r&ROW_COUNT; r++) {
for (int c=0; c&COLUMN_COUNT; c++) {
UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(c*ROW_WIDTH+(c*CELL_SPACING), r*ROW_HEIGHT+(r*CELL_SPACING
), ROW_WIDTH, ROW_HEIGHT)];
imageView.contentMode=UIViewContentModeScaleAspectF
[self.view addSubview:imageView];
[_imageViews addObject:imageView];
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame=CGRectMake(50, 500, 220, 25);
[button setTitle:@&加载图片& forState:UIControlStateNormal];
//添加方法
[button addTarget:self action:@selector(loadImageWithMultiThread) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
//创建图片链接
_imageNames=[NSMutableArray array];
for (int i=0; i&IMAGE_COUNT; i++) {
[_imageNames addObject:[NSString stringWithFormat:@&/cnblogs_com/kenshincui/613474/o_%i.jpg&,i]];
//初始化锁对象
_lock=[[NSLock alloc]init];
#pragma mark 将图片显示到界面
-(void)updateImageWithData:(NSData *)data andIndex:(int )index{
UIImage *image=[UIImage imageWithData:data];
UIImageView *imageView= _imageViews[index];
imageView.image=
#pragma mark 请求图片数据
-(NSData *)requestData:(int )index{
NSString *
[_lock lock];
if (_imageNames.count&0) {
name=[_imageNames lastObject];
[_imageNames removeObject:name];
//使用完解锁
[_lock unlock];
NSURL *url=[NSURL URLWithString:name];
data=[NSData dataWithContentsOfURL:url];
#pragma mark 加载图片
-(void)loadImage:(NSNumber *)index{
int i=[index integerValue];
//请求数据
NSData *data= [self requestData:i];
//更新UI界面,此处调用了GCD主线程队列的方法
dispatch_queue_t mainQueue= dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
[self updateImageWithData:data andIndex:i];
#pragma mark 多线程下载图片
-(void)loadImageWithMultiThread{
int count=ROW_COUNT*COLUMN_COUNT;
dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建多个线程用于填充图片
for (int i=0; i& ++i) {
//异步执行队列任务
dispatch_async(globalQueue, ^{
[self loadImage:[NSNumber numberWithInt:i]];
-(NSData *)requestData:(int )index{
NSString *
//线程同步
@synchronized(self){
if (_imageNames.count&0) {
name=[_imageNames lastObject];
[NSThread sleepForTimeInterval:0.001f];
[_imageNames removeObject:name];
NSURL *url=[NSURL URLWithString:name];
data=[NSData dataWithContentsOfURL:url];
GCD实现多线程--消息信号
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &KCMainViewController.h&
#import &KCImageData.h&
#define ROW_COUNT 5
#define COLUMN_COUNT 3
#define ROW_HEIGHT 100
#define ROW_WIDTH ROW_HEIGHT
#define CELL_SPACING 10
#define IMAGE_COUNT 9
@interface KCMainViewController (){
NSMutableArray *_imageV
dispatch_semaphore_t _//定义一个信号量
@implementation KCMainViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self layoutUI];
#pragma mark 界面布局
-(void)layoutUI{
//创建多个图片控件用于显示图片
_imageViews=[NSMutableArray array];
for (int r=0; r&ROW_COUNT; r++) {
for (int c=0; c&COLUMN_COUNT; c++) {
UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(c*ROW_WIDTH+(c*CELL_SPACING), r*ROW_HEIGHT+(r*CELL_SPACING
), ROW_WIDTH, ROW_HEIGHT)];
imageView.contentMode=UIViewContentModeScaleAspectF
[self.view addSubview:imageView];
[_imageViews addObject:imageView];
UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame=CGRectMake(50, 500, 220, 25);
[button setTitle:@&加载图片& forState:UIControlStateNormal];
//添加方法
[button addTarget:self action:@selector(loadImageWithMultiThread) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
//创建图片链接
_imageNames=[NSMutableArray array];
for (int i=0; i&IMAGE_COUNT; i++) {
[_imageNames addObject:[NSString stringWithFormat:@&/cnblogs_com/kenshincui/613474/o_%i.jpg&,i]];
/*初始化信号量
参数是信号量初始值
_semaphore=dispatch_semaphore_create(1);
#pragma mark 将图片显示到界面
-(void)updateImageWithData:(NSData *)data andIndex:(int )index{
UIImage *image=[UIImage imageWithData:data];
UIImageView *imageView= _imageViews[index];
imageView.image=
#pragma mark 请求图片数据
-(NSData *)requestData:(int )index{
NSString *
/*信号等待
第二个参数:等待时间
dispatch_semaphore_wait(_semaphore, DISPATCH_TIME_FOREVER);
if (_imageNames.count&0) {
name=[_imageNames lastObject];
[_imageNames removeObject:name];
//信号通知
dispatch_semaphore_signal(_semaphore);
NSURL *url=[NSURL URLWithString:name];
data=[NSData dataWithContentsOfURL:url];
#pragma mark 加载图片
-(void)loadImage:(NSNumber *)index{
int i=[index integerValue];
//请求数据
NSData *data= [self requestData:i];
//更新UI界面,此处调用了GCD主线程队列的方法
dispatch_queue_t mainQueue= dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
[self updateImageWithData:data andIndex:i];
#pragma mark 多线程下载图片
-(void)loadImageWithMultiThread{
int count=ROW_COUNT*COLUMN_COUNT;
dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//这里创建一个并发队列(使用全局并发队列也可以)
dispatch_queue_t queue=dispatch_queue_create(&myQueue&, DISPATCH_QUEUE_CONCURRENT);
for (int i=0; i& i++) {
dispatch_async(queue, ^{
[self loadImage:[NSNumber numberWithInt:i]];
KCMainViewController.h
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &UIKit/UIKit.h&
@interface KCMainViewController : UIViewController
#pragma mark 图片资源存储容器
@property (atomic,strong) NSMutableArray *imageN
#pragma mark 当前加载的图片索引(图片链接地址连续)
@property (atomic,assign) int currentI
MultiThread
Created by Kenshin Cui on 14-3-22.
Copyright (c) 2014年 Kenshin Cui. All rights reserved.
#import &KCMainViewController.h&
#import &KCImageData.h&
#define ROW_COUNT 5
#define COLUMN_COUNT 3
#define ROW_HEIGHT 100
#define ROW_WIDTH ROW_HEIGHT
#define CELL_SPACING 10
#define IMAGE_COUNT 9
@interface KCMainViewController (){
NSMutableArray *_imageV
NSCondition *_
@implementation KCMainViewController
#pragma mark - 事件
- (void)viewDidLoad {
[super viewDidLoad];
[self layoutUI];
#pragma mark - 内部私有方法
#pragma mark 界面布局
-(void)layoutUI{
//创建多个图片控件用于显示图片
_imageViews=[NSMutableArray array];
for (int r=0; r&ROW_COUNT; r++) {
for (int c=0; c&COLUMN_COUNT; c++) {
UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(c*ROW_WIDTH+(c*CELL_SPACING), r*ROW_HEIGHT+(r*CELL_SPACING
), ROW_WIDTH, ROW_HEIGHT)];
imageView.contentMode=UIViewContentModeScaleAspectF
[self.view addSubview:imageView];
[_imageViews addObject:imageView];
UIButton *btnLoad=[UIButton buttonWithType:UIButtonTypeRoundedRect];
btnLoad.frame=CGRectMake(50, 500, 100, 25);
[btnLoad setTitle:@&加载图片& forState:UIControlStateNormal];
[btnLoad addTarget:self action:@selector(loadImageWithMultiThread) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnLoad];
UIButton *btnCreate=[UIButton buttonWithType:UIButtonTypeRoundedRect];
btnCreate.frame=CGRectMake(160, 500, 100, 25);
[btnCreate setTitle:@&创建图片& forState:UIControlStateNormal];
[btnCreate addTarget:self action:@selector(createImageWithMultiThread) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnCreate];
//创建图片链接
_imageNames=[NSMutableArray array];
//初始化锁对象
_condition=[[NSCondition alloc]init];
_currentIndex=0;
#pragma mark 创建图片
-(void)createImageName{
[_condition lock];
//如果当前已经有图片了则不再创建,线程处于等待状态
if (_imageNames.count&0) {
NSLog(@&createImageName wait, current:%i&,_currentIndex);
[_condition wait];
NSLog(@&createImageName work, current:%i&,_currentIndex);
//生产者,每次生产1张图片
[_imageNames addObject:[NSString stringWithFormat:@&/cnblogs_com/kenshincui/613474/o_%i.jpg&,_currentIndex++]];
//创建完图片则发出信号唤醒其他等待线程
[_condition signal];
[_condition unlock];
#pragma mark 加载图片并将图片显示到界面
-(void)loadAnUpdateImageWithIndex:(int )index{
//请求数据
NSData *data= [self requestData:index];
//更新UI界面,此处调用了GCD主线程队列的方法
dispatch_queue_t mainQueue= dispatch_get_main_queue();
dispatch_sync(mainQueue, ^{
UIImage *image=[UIImage imageWithData:data];
UIImageView *imageView= _imageViews[index];
imageView.image=
#pragma mark 请求图片数据
-(NSData *)requestData:(int )index{
NSString *
name=[_imageNames lastObject];
[_imageNames removeObject:name];
NSURL *url=[NSURL URLWithString:name];
data=[NSData dataWithContentsOfURL:url];
#pragma mark 加载图片
-(void)loadImage:(NSNumber *)index{
int i=(int)[index integerValue];
[_condition lock];
//如果当前有图片资源则加载,否则等待
if (_imageNames.count&0) {
NSLog(@&loadImage work,index is %i&,i);
[self loadAnUpdateImageWithIndex:i];
[_condition broadcast];
NSLog(@&loadImage wait,index is %i&,i);
NSLog(@&%@&,[NSThread currentThread]);
//线程等待
[_condition wait];
NSLog(@&loadImage resore,index is %i&,i);
//一旦创建完图片立即加载
[self loadAnUpdateImageWithIndex:i];
[_condition unlock];
#pragma mark - UI调用方法
#pragma mark 异步创建一张图片链接
-(void)createImageWithMultiThread{
dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建图片链接
dispatch_async(globalQueue, ^{
[self createImageName];
#pragma mark 多线程下载图片
-(void)loadImageWithMultiThread{
int count=ROW_COUNT*COLUMN_COUNT;
dispatch_queue_t globalQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (int i=0; i& ++i) {
//加载图片
dispatch_async(globalQueue, ^{
[self loadImage:[NSNumber numberWithInt:i]];
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:613089次
积分:2918
积分:2918
排名:第9921名
原创:51篇
评论:280条
关注我的微信公众号,第一时间和我取得联系;获取优质技术文章资讯
(1)(1)(4)(5)(3)(2)(6)(3)(2)(1)(2)(3)(1)(2)(4)(2)(4)(3)(1)(5)(5)

我要回帖

更多关于 myeclipse8.5破解工具 的文章

 

随机推荐