苹果官方文档解读:线程配置与RunLoop实践

0 下载量 180 浏览量 更新于2024-08-27 收藏 265KB PDF 举报
"这篇笔记是作者对苹果《Threading Programming Guide》的二次阅读记录,主要聚焦于线程配置和RunLoop的讨论。文章旨在帮助读者深入理解iOS多线程,通过翻译官方文档并提供Swift实现的代码示例,为Objective-C到Swift的迁移提供参考。线程的配置包括设置栈空间大小、线程存储字典以及线程属性等,这些可以在启动线程前进行定制。" 在iOS开发中,多线程是必不可少的技术,用于提高应用程序的响应性和性能。线程配置是一个关键环节,它允许开发者根据需求调整线程的行为和资源使用。 1. **线程栈空间大小配置**: - 在Cocoa框架下,从OSX v10.5和iOS 2.0开始,可以使用`NSThread`的`stackSize`属性来改变线程的栈大小。不过需要注意,设置的值必须是4KB的倍数,而且这个属性的修改应在线程启动之前进行,因此不能与`detachNewThreadSelector:toTarget:withObject:`方法一起使用,因为该方法会立即启动线程。 - 对于POSIX API,开发者可以使用`pthread_attr_setstacksize`函数设置线程属性`pthread_attr_t`中的栈大小,然后在创建线程时传递这些属性。 2. **线程存储字典**: - 每个线程都有一个专属的字典,可以在其整个生命周期中用来存储数据。这个字典允许开发者以键值对的形式保存线程执行过程中的各种类型信息,例如线程状态。 - 在Cocoa框架中,可以通过`NSThread`的`threadDictionary`属性访问这个`NSMutableDictionary`对象,从而自定义键并存储任意类型的数据。 3. **线程类型与优先级**: - 线程类型通常指的是主线程和工作线程,主线程负责处理用户界面交互,而工作线程则用于执行耗时任务,避免阻塞主线程。 - 线程优先级是另一个可配置的属性,它决定了线程调度的优先级。虽然可以设置,但在iOS中,系统通常会自动管理线程优先级以保持系统的稳定性和响应性,因此过度依赖线程优先级可能会导致不可预测的结果。 4. **RunLoop管理**: - RunLoop是iOS和macOS中的一种机制,它允许线程在等待事件时保持活动而不是阻塞。在多线程环境中,正确管理RunLoop对于优化资源利用和响应时间至关重要。 - 主线程默认拥有一个RunLoop,而工作线程如果没有显式创建,就没有RunLoop。开发者可以通过`NSRunLoop`类的方法来创建、运行和控制RunLoop。 本文提供的Swift代码示例有助于开发者更好地理解和应用这些概念,同时提供了Objective-C到Swift的转换参考,使得跨语言的学习变得更加顺畅。通过深入学习官方文档和实践,开发者能够更好地掌握iOS多线程的精髓,从而编写出高效、稳定的多线程应用。

Exception in Application constructor Exception in thread "main" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071) Caused by: java.lang.RuntimeException: Unable to construct Application instance: class com.example.demo.Main at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:891) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class com.example.demo.Main (in module com.example.javafxtest) because module com.example.javafxtest does not export com.example.demo to module javafx.graphics at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:392) at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:674) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:489) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:803) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457) at java.base/java.security.AccessController.doPrivileged(AccessController.java:399) at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456) at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184) ... 1 more

2023-05-24 上传

Exception in Application constructor Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:893) Caused by: java.lang.RuntimeException: Unable to construct Application instance: class Main at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:907) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182) at java.lang.Thread.run(Thread.java:750) Caused by: java.lang.NoSuchMethodException: Main.<init>() at java.lang.Class.getConstructor0(Class.java:3110) at java.lang.Class.getConstructor(Class.java:1853) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$7(LauncherImpl.java:818) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$3(WinApplication.java:177) ... 1 more出现这个报错怎么解决

2023-05-26 上传
2023-07-14 上传