Android(java)学习笔记62:关于多线程的实现(代码体现)

 1 package cn.itcast_02;
 2
 3 /*
 4  * 该类要重写run()方法,为什么呢?
 5  * 不是类中的所有代码都需要被线程执行的。
 6  * 而这个时候,为了区分哪些代码能够被线程执行,java提供了Thread类中的run()用来包含那些被线程执行的代码。
 7  */
 8 public class MyThread extends Thread {
 9
10     @Override
11     public void run() {
12         // 自己写代码
13         // System.out.println("好好学习,天天向上");
14         // 一般来说,被线程执行的代码肯定是比较耗时的。所以我们用循环改进
15         for (int x = 0; x < 200; x++) {
16             System.out.println(x);
17         }
18     }
19
20 }

重写完这个MyThread这个类,我们接下来编写类,添加main方法,创建对象,调用这个类:

 1 package cn.itcast_02;
 2
 3 /*
 4  * 需求:我们要实现多线程的程序。
 5  * 如何实现呢?
 6  *         由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。
 7  *         而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程。
 8  *         Java是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序。
 9  *         但是呢?Java可以去调用C/C++写好的程序来实现多线程程序。
10  *         由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西,
11  *         然后提供一些类供我们使用。我们就可以实现多线程程序了。
12  * 那么Java提供的类是什么呢?
13  *         Thread
14  *         通过查看API,我们知道了有2中方式实现多线程程序。
15  *
16  * 方式1:继承Thread类。
17  * 步骤
18  *         A:自定义类MyThread继承Thread类。
19  *         B:MyThread类里面重写run()?
20  *             为什么是run()方法呢?
21  *         C:创建对象
22  *         D:启动线程
23  */
24 public class MyThreadDemo {
25     public static void main(String[] args) {
26         // 创建线程对象
27         // MyThread my = new MyThread();
28         // // 启动线程
29         // my.run();
30         // my.run();
31         // 调用run()方法为什么是单线程的呢?
32         // 因为run()方法直接调用其实就相当于普通的方法调用,所以你看到的是单线程的效果
33         // 要想看到多线程的效果,就必须说说另一个方法:start()
34         // 面试题:run()和start()的区别?
35         // run():仅仅是封装被线程执行的代码,直接调用是普通方法
36         // start():首先启动了线程,然后再由jvm去调用该线程的run()方法。
37         // MyThread my = new MyThread();
38         // my.start();
39         // // IllegalThreadStateException:非法的线程状态异常
40         // // 为什么呢?因为这个相当于是my线程被调用了两次。而不是两个线程启动。第一个已经start已经启动线程,第二个start再启动则会报错。
41         // my.start();
42
43         // 创建两个不同线程对象
44         MyThread my1 = new MyThread();
45         MyThread my2 = new MyThread();
46
47         my1.start();
48         my2.start();
49     }
50 }

执行代码我们看到了结果如下图:也许有人会问这个第一次运行的0,1,2,3……这样输出的是那个线程的?(my1还是my2线程的?),下面我们会回答这样的问题。

针对刚刚我们提出的问题,我们来说明一下(我们用代码实现一下):

这个是我们写的一个线程类:

 1 package cn.itcast_03;
 2
 3 public class MyThread extends Thread {
 4
 5     public MyThread() {
 6     }
 7
 8     public MyThread(String name){
 9         super(name);
10     }
11
12     @Override
13     public void run() {
14         for (int x = 0; x < 100; x++) {
15             System.out.println(getName() + ":" + x);
16         }
17     }
18 }

下面我们再次写出测试类:

 1 package cn.itcast_03;
 2
 3 /*
 4  * 如何获取线程对象的名称呢?
 5  * public final String getName():获取线程的名称。
 6  * 如何设置线程对象的名称呢?
 7  * public final void setName(String name):设置线程的名称
 8  *
 9  * 针对不是Thread类的子类中如何获取线程对象名称呢?
10  * public static Thread currentThread():返回当前正在执行的线程对象
11  * Thread.currentThread().getName()
12  */
13 public class MyThreadDemo {
14     public static void main(String[] args) {
15         // 创建线程对象
16         //无参构造+setXxx()
17         // MyThread my1 = new MyThread();
18         // MyThread my2 = new MyThread();
19         // //调用方法设置名称
20         // my1.setName("林青霞");
21         // my2.setName("刘意");
22         // my1.start();
23         // my2.start();
24
25         //带参构造方法给线程起名字
26         // MyThread my1 = new MyThread("林青霞");
27         // MyThread my2 = new MyThread("刘意");
28         // my1.start();
29         // my2.start();
30
31         //我要获取main方法所在的线程对象的名称,该怎么办呢?
32         //遇到这种情况,Thread类提供了一个很好玩的方法:
33         //public static Thread currentThread():返回当前正在执行的线程对象
34         System.out.println(Thread.currentThread().getName());
35     }
36 }
37
38 /*
39 名称为什么是:Thread-? 编号,下面是源码(注意这里我只是截取我需要的,方便理解和说明)
40
41 class Thread {
42     private char name[];
43
44     public Thread() {
45         init(null, null, "Thread-" + nextThreadNum(), 0);
46     }
47
48     private void init(ThreadGroup g, Runnable target, String name,
49                       long stackSize) {
50         init(g, target, name, stackSize, null);
51     }
52
53      private void init(ThreadGroup g, Runnable target, String name,
54                       long stackSize, AccessControlContext acc) {
55         //大部分代码被省略了
56         this.name = name.toCharArray();
57     }
58
59     public final void setName(String name) {
60         this.name = name.toCharArray();
61     }
62
63
64     private static int threadInitNumber; //0,1,2
65     private static synchronized int nextThreadNum() {
66         return threadInitNumber++; //return 0,1
67     }
68
69     public final String getName() {
70         return String.valueOf(name);
71     }
72 }
73
74 class MyThread extends Thread {
75     public MyThread() {
76         super();
77     }
78 }
79
80 */

附上执行效果图:

这里不得不说这样的线程名字很没有针对性,大家说是不是?当然我们可以自己取线程的名字,调用setName()方法

时间: 2024-12-28 01:52:34

Android(java)学习笔记62:关于多线程的实现(代码体现)的相关文章

Java学习笔记_网络+多线程

支持同时收发的客户端和服务器端 客户端 1 import javax.swing.*; 2 import java.awt.*; 3 import java.io.*; 4 import java.net.*; 5 import java.awt.event.*; 6 7 public class ChatClient { 8 private JTextArea incoming; 9 private JTextField outgoing; 10 private PrintWriter wri

java学习笔记之初识多线程

初识多线程 一.进程的认识: 1.进程的理解: 进程可以理解成正在执行的任务,就是正在运行的程序,进程又分为两种,一种是前台进程,就是我们很直观看见的,另一种是后台进程,就是操作系统启动就有的(系统级的进程),每个进程运行之后都会占用一定的cpu和内存资源: 比如说:我们打开window任务管理器就可以看到有很多的进程,里面有用户开启的,也有操作系统启动的进程 2.进程的调度: 也就是那么多的进程,cpu是怎样运行的呢? 采用时间片轮转法 二.线程认识 1.线程的理解 线程是在进程的内部运行的执

Java学习笔记五(多线程)

1.介绍 线程能够使程序具有两条和两条以上的可执行的路径,尤其对多核CPU特别的重要. 2.创建线程 1.继承Thread类 一个类直接的继承Thread类的话,此类就具有了线程的能力,接下来只需要重写继承的run()即可. <span style="font-size:18px;">package com.Thread; //定义实现Runnable接口的类 class MyThread11 extends Thread { //实现run方法,指定线程执行的任务 pub

JAVA学习笔记(四十一)-多线程与线程组

线程组ThreadGroup /* * 线程组ThreadGroup * * 结论: * 如果在设置线程组优先级之前设置线程优先级,则线程优先级不受线程组优先级限制 * 如果在设置线程组优先级之后设置线程优先级,则线程优先级不能超过线程组优先级 * * 线程的优先级,默认与启动它的父线程相同,但受到所有线程组的限制 */ public class Test02 { public static void main(String[] args) { System.out.println(Thread

Java学习笔记45(多线程二:安全问题以及解决原理)

线程安全问题以及解决原理: 多个线程用一个共享数据时候出现安全问题 一个经典案例: 电影院卖票,共有100座位,最多卖100张票,买票方式有多种,网上购买.自主售票机.排队购买 三种方式操作同一个共享数据,这时候会出现安全问题: 示例: package demo1; public class Tickets implements Runnable { private int ticket = 100; public void run(){ while(true){ if (ticket>0) {

Java学习笔记46(多线程三:线程之间的通信)

多个线程在处理同一个资源,但是线程的任务却不相同,通过一定的手段使各个线程能有效地利用资源, 这种手段即:等待唤醒机制,又称作线程之间的通信 涉及到的方法:wait(),notify() 示例: 两个线程一个输入,一个输出 package demo; public class Resource { public String name; public String sex; } 输入线程: package demo; public class Input implements Runnable

android NDK 学习笔记(4)---eclipse 添加代码提示功能

1.选择项目右键Android Tools-->Add native support,然后再右键property. 随便选一个android的文件夹下面的include导入点击确定. 导入后会自动生成下面的文件,不用我们自己新建.c文件.系统会自动生成一个.c++的文件 编辑.cpp的文件

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(5)---对象池模式

这次要介绍一下对象池模式(Object Pool Pattern),这个模式为常见 23 种设计模式之外的设计模式,介绍的初衷主要是在平时的 android 开发中经常会看到,比如 ThreadPool 和 MessagePool 等. 在 java 中,所有对象的内存由虚拟机管理,所以在某些情况下,需要频繁创建一些生命周期很短使用完之后就可以立即销毁,但是数量很大的对象集合,那么此时 GC 的次数必然会增加,这时候为了减小系统 GC 的压力,对象池模式就很适用了.对象池模式也是创建型模式之一,

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl