《一》基本概念理解

1.什么是进程?

进程就是在某种程度上相互隔离,独立运行的程序。一般来说,系统都是支持多进程操作的,这所谓的多进程就是让系统好像同时运行多个程序。

2.什么是线程呢?

一个进程可以包含多个线程,在程序中是独立的,并发执行的流,但是与分隔的线程相比,进程中的线程之间的隔离程度要小。他们共享内存,文件句柄和每个线程应有的状态。

3.进程和线程的区别:

(1)一个进程可以包含多个线程,线程比进程具有更高的性能.

这是因为多个线程将共享同一个进程的虚拟空间。线程共享的环境包括:线程代码块,进程的共有数据等。利用这些共享的数据,县城很容易实现相互间的通信。

(2)进程间不能共享内存,线程间共享内存很容易。

(3)系统创建进程需要为该进程分配系统资源,但创建线程则代价小的多,因此使用线程开始先多任务并发比多线程效率高。

《二》线程的应用

1.创建线程的方式一:通过Thread来实现。

Thread()创建一个线程。

Thread(Runnable targer):创建一个线程,并指定一个目标。

Thread(String name ):创建一个名为name 的线程。

Thread(ThreadGroup group ,Runnable targer):创建一个隶属于group线程组的线程。

Thread(ThreadGroup group ,Runnable targer,String name):创建一个隶属于group线程组,目标为target,名字为name的线程。

Thread(ThreadGroup group ,String name):创建一个名字为name,隶属于group的线程组。

用Thread来实现多线程,还包括两种写法。

(1)使用局部内部类的方式实现。如下:红色标记表示不同的地方,请注意看。

public class TestThead {
public static void main(String[] args) {
//调用线程
MyThread myThread = new MyThread();
//启动一个线程
myThread.start();
for (int i = 0; i < 100; i++) {
System.out.println("线程一");
}
}
}
//局部内部类的方式创建。继承Thread类重写run方法。
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程二");
}
}
}

(2)直接继承Thread类。如下:

public class TestThead2 extends Thread {
public static void main(String[] args) {
//创建本类的对象
TestThead2 testThead2 = new TestThead2();
//创建一个线程
Thread thread = new Thread(testThead2);
//启动一个线程
thread.start();
for (int i = 0; i < 100; i++) {
System.out.println("线程一");
}
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程二");
}
}
}

.创建线程的方式二:通过Runnable接口实现多线程的创建。

(1)使用局部内部类的方法

public class TestThead3 {
public static void main(String[] args) {
// 启动线程
ThreeThread target = new ThreeThread();
Thread thread = new Thread(target);
thread.start();
for (int i = 0; i < 100; i++) {
System.out.println("线程一");
}
}
} class ThreeThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程二");
}
}

(2)直接继承接口

public class TestThead5 implements Runnable {
public static void main(String[] args) {
// 启动线程
ThreeThread5 target = new ThreeThread5();
Thread thread = new Thread(target);
thread.start();
for (int i = 0; i < 100; i++) {
System.out.println("线程一");
}
} @Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程二");
}
}
}

3.两种创建线程的方法比较

(1)使用Runnable接口

可以将CPU,代码和数据分开,形成清晰的模型。
使用接口后,该类还可以继承别的类。

保持程序风格一致。

(2) 使用Thread类

不能再从其他类继承。

编写简单,可以直接操作线程,无需使用Thread.currentThread().

4.守护线程。

有一种线程,他是从后台运行的,他的任务是为其他线程提供服务,这种线程被称为守护线程。 典型的案例:定时器(Timer)

(1)setDaemon(boolean d):把普通线程设置为守护线程(又叫:后台线程)

(2)isDaemon():测试特定线程是否是后台线程。

例子如下:

package com.zyy;
// 线程的优先级
public class MyDaemon {
public static void main(String[] args) {
Run run = new Run();
Thread th1 = new Thread(run);
th1.setDaemon(true);
System.out.println(th1.isDaemon());// 判断某个线程是不是守护线程。
th1.start();
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"--"+i);
}
}
} class Run implements Runnable{
@Override
public void run() {
while(true){
System.out.println("我是守护线程");
}
}
}

5.线程的状态

进程可以分为五中状态:新建,就绪,运行,阻塞,死亡

(1)当使用new来创建一个线程的时候,他处于new状态,这时候,线程并没有进行任何的操作。

(2)当使用线程的start()方法时候,想线程调度程序注册一个线程,这个时候这个线程就就绪了,就等待CPU给他分配时间了。

(3)调用线程的Run方法给已经注册的线程,执行的机会。进入运行状态。

(4)当run方法执行完毕后,线程将被抛弃。进入死亡状态。

(5)如果线程在运行状态中因为IO阻塞,等待键盘输入,调用线程的sleep(),wait()方法,线程就会进入阻塞状态,以上导致阻塞的因素消失了,如“输入结束”,则进入就绪状态,继续等待CPU分配的时间。

6.线程的结束方式

线程有三种结束方式:

(1)运行到run方法的结尾,自动结束

(2)线程抛出一个未捕获的异常

(3)另一个线程调用Deprecate的stop()方法,由于这个方法会引起线程的不安全问题,所以已经不推荐使用了。

7.线程的优先级

getPriority()、setPriority得到和设置当前线程的优先级。优先级1-10,如果不指定默认是5.理论上,谁优先级高,谁被cpu调度的可能性就大。但是优先级低的并不是不执行。资源不足的时候才有效果。这个只是程序员实行的建议权。

举个例子:

public class TestProprity {
public static void main(String[] args) {
myRun myRun = new myRun();
Thread thread1 = new Thread(myRun,"乌龟4");
thread1.start();
thread1.setPriority(4);
Thread thread2 = new Thread(myRun,"乌龟10");
thread2.start();
thread2.setPriority(10);
Thread.currentThread().setName("兔子");
for (int i = 0; i < 100; i++) {
System.out.println("线程一"+Thread.currentThread().getName()+Thread.currentThread().getPriority());
}
}
}
class myRun implements Runnable
{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程二"+Thread.currentThread().getName());
} } }

8.线程的其他常用方法。

1.       sleep:让当前线程停止执行(休眠)一段时间。

2.       join:如果在A线程中B线程join进来,则现在执行B的内容,直到B执行完毕才继续执行A。比如A是显示数据  B是收集收据。

3.       yield:让位:让出执行权,和其他线程争夺资源,谁拿到cpu时间片谁执行。

4.        wait:线程进入等待状态,等待notify()的唤醒。

《三》定时器的应用

public class TestTimer extends JFrame {
private static final long serialVersionUID = 1L;
private JLabel lbshow;
private int niIndex=2; public TestTimer() { JPanel basicJPanel = new JPanel();
basicJPanel.setLayout(new BorderLayout());
lbshow = new JLabel();
lbshow.setIcon(new ImageIcon("logo/1.png"));
basicJPanel.add(lbshow, BorderLayout.CENTER);
setContentPane(basicJPanel);
setBounds(200, 200, 410, 320);
setVisible(true);
Timer timer = new Timer();
myTimerTask task = new myTimerTask();
//第一参数:到了时间要执行的目标,二:多长时间之后开始进行计时。三:每隔1S执行一次。
timer.schedule(task,1000, 1000);
} public class myTimerTask extends TimerTask { @Override
public void run() {
// TODO Auto-generated method stub
if(niIndex<7) {
niIndex++;
lbshow.setIcon(new ImageIcon("logo/"+niIndex+".png")); }
}
} public static void main(String[] args) {
new TestTimer();
}
}

android基础篇------------java基础(12)(多线程操作)的更多相关文章

  1. android基础篇------------java基础(11)(文件解析xml and Json )

    一:xml文件解析 首先看一下:我们要解析的内容: <?xml version="1.0" encoding="gbk" ?> - <book ...

  2. Java学习 (四)基础篇 Java基础语法

    注释&标识符&关键字 注释 注释并不会被执行,其主要目的用于解释当前代码 书写注释是一个非常好的习惯,大厂要求之一 public class hello { public static ...

  3. 这篇 Java 基础,我吹不动了

    Hey guys,这里是程序员cxuan,欢迎你收看我最新一期的文章,这篇文章我补充了一些关于<Java基础核心总结>的内容,修改了部分错别字和语句不通顺的地方,并且对内部类.泛型等内容进 ...

  4. iOS开发基础篇-Button基础

    一.简单介绍  UIButton 的功能:响应用户操作.显示文字.显示图片.调整内部图片和文字的位置. 二. UIButton 的状态  UIControlStateNormal :普通状态,为默认情 ...

  5. [android开发篇]java环境配置

    http://www.runoob.com/java/java-environment-setup.html Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. window ...

  6. 【Java 基础】Java 基础索引

    Java 基础 注解 [注解]深入理解Java注解类型(@Annotation) [注解]Java注解(1)-基础 [注解]Java注解(2)-运行时框架 [注解]Java注解(3)-源码级框架

  7. Java核心基础第4篇-Java数组的常规操作

    Java数组 一.数组简介 数组是多个相同类型数据的组合,实现对这些数据的统一管理 数组属引用类型,数组型数据是对象(Object) 数组中的元素可以是任何数据类型,包括基本类型和引用类型 数组类型是 ...

  8. python 基础篇 04(列表 元组 常规操作)

    本节主要内容:1. 列表2. 列表的增删改查3. 列表的嵌套4. 元组和元组嵌套5. range 一. 列表1.1 列表的介绍列表是python的基础数据类型之一 ,其他编程语言也有类似的数据类型. ...

  9. “全栈2019”113篇Java基础学习资料及总结

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. 解决一个Android Studio gradle的小问题

    自从Android Studio有了gradle之后,就经常有问题,最近在Ubuntu上用Android Studio的时候就遇到一个问题,每次项目目录更改了,Import项目,打开项目,还是新建项目 ...

  2. 射频识别技术漫谈(28)——基于MF1射频卡的酒店门锁设计

    电子门锁是现代星级酒店管理电子化.智能化的重要电子设备.相较于传统的机械锁,基于RFID技术的电子门锁使用方便,易于管理,安全性高,可实现对开锁用户的分优先级自动管理,对房间入住信息实现自动统计与报表 ...

  3. Windows Azure 上 Linux VM 中的交换空间 – 第 2 部分

    本文章由 Azure CAT 团队的 Piyush Ranjan (MSFT) 撰写. 在前一篇文章 Windows Azure 上Linux VM 中的交换空间第 1 部分中,我介绍了在默认情况下, ...

  4. delphi调用外部程序打开文件

    delphi调用外部程序打开文件 ShellExecute的各种用法 一.利用系统默认的邮件收发器发送电子邮件 Uses ..., ShellAPI; Var lpHwnd: HWND; lpOper ...

  5. mirantis cert

    with no vendor specificity and/or proprietary implementations,没有供应商的特异性和/或专有的实现 https://training.mir ...

  6. 时尚B2B方兴未艾-Maker’s Row 获100万美元种子投资 |华丽志

    时尚B2B方兴未艾-Maker's Row 获100万美元种子投资 |华丽志 华丽志 » 网internet, 时尚B2B方兴未艾-Maker's Row 获100万美元种子投资 由 luxeco 发 ...

  7. 网页解析不了PHP源代码的解决方法

    一般出现这个错误都是因为修改了apache配置文件,但是没有使apache配置生效. 所以只要执行以下命令就行了: sudo apachectl restart sudo apachectl grac ...

  8. Cocos2d-iPhone V3 (2) 场景转换

    Cocos2d-iPhone V3 (2) 场景转换 博客:http://blog.csdn.net/prevention 作者:大锐哥 - 1. 准备工作 创建一个场景会吧? #import &qu ...

  9. BootStrap 智能表单系列 二 BootStrap支持的类型简介

    代码如下(链接地址:https://github.com/xiexingen/Bootstrap-SmartForm/blob/master/demo/form1-basic.html): <! ...

  10. Windows系统中使用WMI获取远程服务器的信息

    使用WMI获取远程服务器的状态 我做的项目里边主要包含两个内容: (1)对发布在服务器上的服务(IIS服务.WCF服务)是否可以正常访问: (2)获取服务器上的部分指标:如CPU.内存.磁盘空间信息等 ...