写到外面就是了哈。。
public class Example8_1 {
public static void main(String[] args) {
WriteWordThread zhang, wang
zhang = new WriteWordThread("张小红")// 出错
wang = new WriteWordThread("JamsKeven")// 出错
zhang.start()
for (int i = 1i <= 8i++) {
System.out.println("主线程运行.")
}
wang.start()
}
}
class WriteWordThread extends Thread {
WriteWordThread(String s) {
setName(s)
}
public void run() {
for (int i = 1i <= 8i++) {
System.out.println("我是线程:" + getName())
}
}
}
第65篇
极客时间《9小时搞定微信小程序开发》第五课:原生API。
小程序API最后一部分,课程中没有详细去讲,因为当时开放的API还没有现在这么多,而且这部分API偏于后台控制,大多是后期逐步新增的。
wx.getUpdateManager 获取 全局唯一 的版本更新管理器,用于管理小程序更新
UpdateManager对象用来管理更新,有强制小程序重启并使用新版本、监听小程序版本更新事件等方法。
一些异步处理的任务,可以放置于 Worker 中运行,待运行结束后,再把结果返回到小程序主线程。Worker 运行于一个单独的全局上下文与线程中,不能直接调用主线程的方法。
Worker 最大并发数量限制为 1 个,创建下一个前需要结束当前 Worker;Worker 与主线程之间的数据传输,双方使用 Worker.postMessage()来发送数据,Worker.onMessage()来接收数据,传输的数据并不是直接共享,而是被复制的。
wx.reportMonitor,自定义业务数据监控上报接口,最多可以创建128个监控事件
监听或取消监听小程序切换前后台、错误事件
wx.canIUse:判断小程序的API,回调,参数,组件等是否在当前版本可用
绘图相关的API,主要是对CanvasContent对象的使用,实现各种颜色、线条、内容填充的控制
可以用以下几种方式来表示 canvas 中使用的颜色:
RGB 颜色: 如 'rgb(255, 0, 0)'
RGBA 颜色:如 'rgba(255, 0, 0, 0.3)'
16 进制颜色: 如 '#FF0000'
预定义的颜色: 如 'red'
其中预定义颜色有148个: 自定义颜色
调试开关和日志管理器的API,console可以向调试面板打印debug\error\info\log\warn共5类日志,logmanager最多保存5M的日志内容,超过5M后,旧的日志内容会被删除。
获取第三方平台的自定义的数据字段。小程序运营者可以一键授权给第三方平台,通过第三方平台完成业务。
第三方平台有单独的说明,参见: 第三方平台
创建 map 上下文 MapContext 对象,MapContext实现以下功能
对小程序框架中的路由控制进行扩充,实现关闭页面后返回或跳转到其他页面的 *** 作。
对小程序转发功能的控制,就是小程序右上角关闭按钮旁边3个小白点里的『转发』。
获取系统信息,主要包括以下信息:
设定或取消定时器,按照指定周期或在定时到期之后执行注册的回调函数
IntersectionObserver 对象,用于推断某些节点是否可以被用户看见、有多大比例可以被用户看见
SelectorQuery,查询节点信息的对象
小程序开发框架提供的API变得越来越多,通过这些微信原生的API,可以快速方便的调用微信的能力,比如文件的控制、图片视频的控制、数据的缓存、微信支付等,从而实现更加复杂多样的业务。
/*** 闲的无聊 解释着玩
* 我就按照
* [步骤] 说明 给你说清楚了
*/
import javax.microedition.midlet.*
import javax.microedition.lcdui.*
public class FirstOne extends MIDlet {
private MyCanvas mycan
private Display dis
/**
* [1] 先构造方法 这没什么可说的
*/
public FirstOne() {
//这句话获得当前的屏幕对象
dis = Display.getDisplay(this)
//调用MyCanvas构造 这句话到[2]
mycan = new MyCanvas()
//构造完毕 到[4]
}
/**
*
* [4] 为什么会到这里 是因为这是j2me运行机制决定的 原理就跟那个paint()一样 由系统调用
* (就是别人规定这么运行的,他规定运行完了midlet的构造方法,就要运行startApp
* 而你继承重写了这个方法 所以将会调用你的代码
*
*/
protected void startApp() {
//将当前屏幕设置成mycanvas
//mycanvas开始接管屏幕显示工作 这里的setCurrent方法会调用一次paint()
//所以没绘制线程的情况下也会执行一次绘制任务.造成两个线程在一个时间段内都会执行同一段代码
dis.setCurrent(mycan)
/**
* 到此主线程后续没有和你自写的程序相关任务了.
* 主线程无非也就是一个由别人(开发java的人)写好的public void run()方法,
* 别人让主线程处理完了你的程序以后干什么,或是什么都不做,不是咱们所关心的.但重要的是要知道主线程一直都存在,
* 理解这点很重要.
* 你可以控制主线程结束,但那样你的程序也就结束了.
*/
}
protected void pauseApp() {
}
protected void destroyApp(boolean un) {
dis.setCurrent(null)
}
}
import java.lang.Runnable
import javax.microedition.lcdui.*
import java.lang.Thread
public class MyCanvas extends Canvas implements Runnable {
static final int SeaGreen = 0x578b2e
static final int Tomato = 0x4763ff
private static int width
private static int height
/**
* [2] 构造
*/
public MyCanvas() {
width = getWidth()
height = getHeight()
try {
//创建线程
Thread mythread = new Thread(this)
/**
* 顺便解释一下调用机制,这个不是三言两语就能说清楚的 只能看你的领悟力了
* 先说线程
* 都知道代码是 自顶而下 一句一句运行(如果不开任何线程,只有一个线程 这个线程就是主线程).而且是由cpu一句一句运行.
* 但出了多线程这个概念 这时候发生变化了 比如两个线程
*你可以理解为 进入了双核cpu时代 相当于多了一个cpu 同时开工 可以运行两个程序
*放到这里来说 就是 主线程(主cpu)往下一句一句运行代码 而新开一个线程(另一个cpu)负责每隔多少时间画一下屏幕(称之为绘制线程) 两cpu同时配合执行同一个程序
*而主线程还在自顶而下运行着,并不知道什么时候过了1000毫秒 需要刷新屏幕 而且这时候正在运行其他代码 也无法调用repaint()进行绘制任务.所以需要绘制线程计算
*时间,时间到了执行这段代码. (多线程很复杂,而且跟cpu运行有本质区别,要想真正参透那就多看看线程文章,多动手练练吧)
*
* 调用机制 :语法你得懂吧,不懂无能为力...
*
* 有如下三个类
* Canvas.java System.java MyCanvas.java
* [伪代码]
* Canvas 里有个方法
* protected abstract void paint()
*
* System 里有个方法 有个属性
* Canvas c =new MyCanvas()
* void doSomeThing(){
* c.paint()
* }
*
* MyCanvas继承Canvas
* MyCanvas extends Canvas{
* protected void paint(){
* //绘制任务
* System.out.println("调用我")
* }
* }
*
* 你能明白System是如何调用的 MyCanvas 的paint()而不是Canvas 的paint()吗?
* 实际上Canvas 和 System是由别人写好的,而MyCanvas你自己写的
* 换句话说 你能明白系统是如何调用的 你写的类的方法 而不是系统自己的canvas的方法吗?
* 系统调用的抽象方法paint()而不用管是由谁实现的paint()方法,系统只需要知道有这么个方法而且我能用就行了.
* 或许你对这句话有疑问 系统如何知道 我写的 Mycanvas?
* 这句话Canvas c =new MyCanvas()
* 这个是在 FirstOne里的这句话
* dis.setCurrent(mycan)
* 相当于 System.setCanvas(new MyCanvas())
* 但咱没源代码,实际上内部也是这么实现的.
* 按照这个原理就不难理解为啥会调用paint(Graphics g)
* 而runnable的run()也是由于你这原因而运行的,所以所有看似现成的类都是由别人(java开发人员)写好的,别人规定怎么运行 ,
* 你按照别人的规定的规则写出新的类或方法,别人就能使用你写出的方法或类.所以整个j2me类库就是别人定的规则,
* 想玩游戏吗?就得按照游戏的规则来.就和么简单
*
*
*/
//线程开始 这样同时就有两个线程(两段代码)开始运行了 绘制线程进入[3] 主线程继续运行 这时候是同时运行的[3][2]
//mythread.start()会调用Runnable接口的run方法 可以看看jdk源代码 Thread类实现
mythread.start()
} catch (Exception e) {
e.printStackTrace()
}
//构造方法运行完毕 主线程回到[1] 继续运行
}
/**
* [5] 根据调用机制 所以不是由你自己直接调用paint()
* 而参数Graphics g是由系统传给你的 所以也不需关心Graphics g是怎么来的
*/
public void paint(Graphics g) {
g.setColor(SeaGreen)
g.fillRect(0, 0, width, height)
g.setColor(Tomato)
g.drawString("I am a developer.", 0, 0, Graphics.TOP | Graphics.LEFT)
//paint执行完毕绘制线程退回到[6]
}
/**
* [3] 绘制线程进入
*/
public void run() {
/**
*线程会执行run()方法里的代码一次 因为是死循环的代码
*所以绘制线程不停的执行这段代码
*while里边的代码
*/
while (true) {
try {
//repaint()会调用paint()方法 进行屏幕绘制
// 至于为什么 写repaint()这个方法的人规定的 没啥好说的 绘制线程进入[5]
repaint()
//[6]
//绘制线程休眠100毫秒
Thread.sleep(100)
} catch (Exception e) {
e.printStackTrace()
}
//又会回到while (true) 调用repaint()
}
//永远不会执行到这里(例外是打断线程休眠)
}
}
洋洋洒洒写了一大堆,不知所云 如果你真能理解java运行机制 线程之类的 一通百通 像为什么[1]会首先运行就会小case一样 加油吧~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)