本站已关停,现有内容仅作科研等非赢利用途使用。特此声明。
查看: 923|回复: 2
打印 上一主题 下一主题

Android菜鸟饭团#Java中文学习#第二十课 活动笔记

[复制链接]
跳转到指定楼层
1#
发表于 2015-5-13 10:28:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wangjintao 于 2015-5-13 15:30 编辑

Android菜鸟饭团#Java中文学习#第二十课 活动笔记

首先学习的是线程,那就先了解一下线程的基本概念吧
线程创建和启动的两种方法
但是推荐使用第一种方法,
然后就是线程的控制,
其中的sleep,join,yield方法尤为重要,要牢记他的作用
其次考虑的就是线程的优先级
接下来就是Print流以及Object流

另加的一点就是对线程的各个运作状态的详细解释
线程的调度
1、调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会。

Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:
static int MAX_PRIORITY
          线程可以具有的最高优先级,取值为10。
static int MIN_PRIORITY
          线程可以具有的最低优先级,取值为1。
static int NORM_PRIORITY
          分配给线程的默认优先级,取值为5。

Thread类的setPriority()和getPriority()方法分别用来设置和获取线程的优先级。

每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY。
线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级。
JVM提供了10个线程优先级,但与常见的操作系统都不能很好的映射。如果希望程序能移植到各个操作系统中,应该仅仅使用Thread类有以下三个静态常量作为优先级,这样能保证同样的优先级采用了同样的调度方式。

2、线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。

3、线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait(0) 一样。

4、线程让步:Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。

5、线程加入:join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。

6、线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。 直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。

注意:Thread中suspend()和resume()两个方法在JDK1.5中已经废除,不再介绍。因为有死锁倾向。

7、常见线程名词解释
主线程:JVM调用程序mian()所产生的线程。
当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。
后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。
前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。

最后附加一个本课的小例子
public class ThreadTest extends Thread {

    public static int n = 100;

    public static int t1Num = 0; //记录t1执行的次数

    public String treadName;

    public ThreadTest(String treadName, int newPriority) {

        setPriority(newPriority);

        this.treadName = treadName;

    }

    public void run() {

        while (true) {

            if (n < 1) {

                break;

            }

            System.out.println(treadName + ": " + n--);

            if (treadName.equals("t1")) {

                t1Num++;

            }

        }

        System.out.println("t1执行的次数" + t1Num);

    }



    public static void main(String[] args) {

        ThreadTest test1 = new ThreadTest("t1", Thread.MAX_PRIORITY);

        test1.start();

        ThreadTest test2 = new ThreadTest("t2", Thread.MIN_PRIORITY);

        test2.start();

    }

}

打印出来的结果:截取部分:t2: 3

t1: 2

t1执行的次数66

t2: 1

t1执行的次数66

【书记员:王锦涛】
每一个技术小白都有一个成为大神的梦想,现在Android菜鸟饭团就给你这个成就梦想的机会。我们提供最新的Android技术教学,只要你又耐心和毅力就一定会在这里有所收获。
Android菜鸟饭团南阳GDG组织发起,秉承着开放、分享、创新的原则,希望通过GDG社区的力量能够给更多的想要学习Android开发技术的小白们创造一个学习,交流,分享的环境。同往常的GDG活动一样,我们依然是任性的一个子都不要,并且还在周六的分享中提供盒饭和不定期的惊喜小礼物呦~所以快来加入我们吧,为你的大神梦想迈出第一步。
把你的个人信息和申请理由快快发送到android@chuang1.net,前来加入我们吧

ChinaGDG.com
回复

使用道具 举报

2#
发表于 2015-5-13 13:49:29 | 只看该作者
通过这节课的学习知道了:线程是一个程序里面不同的执行路径。
进程里面有线程,线程是进程的一种路径,指定的某个时间cpu只有一个线程在执行。
可以通过Thread中的方法改变执行线程的顺序,以及是否睡眠,还有优先级的问题。
ChinaGDG.com
回复 支持 反对

使用道具 举报

3#
发表于 2015-5-13 19:54:33 | 只看该作者
讲的线程主要是控制先执行哪个程序、控制程序的执行!其他没啥问题了。
ChinaGDG.com
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表