android基础篇------------java基础(12)(多线程操作)
《一》基本概念理解
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)(多线程操作)的更多相关文章
- android基础篇------------java基础(11)(文件解析xml and Json )
一:xml文件解析 首先看一下:我们要解析的内容: <?xml version="1.0" encoding="gbk" ?> - <book ...
- Java学习 (四)基础篇 Java基础语法
注释&标识符&关键字 注释 注释并不会被执行,其主要目的用于解释当前代码 书写注释是一个非常好的习惯,大厂要求之一 public class hello { public static ...
- 这篇 Java 基础,我吹不动了
Hey guys,这里是程序员cxuan,欢迎你收看我最新一期的文章,这篇文章我补充了一些关于<Java基础核心总结>的内容,修改了部分错别字和语句不通顺的地方,并且对内部类.泛型等内容进 ...
- iOS开发基础篇-Button基础
一.简单介绍 UIButton 的功能:响应用户操作.显示文字.显示图片.调整内部图片和文字的位置. 二. UIButton 的状态 UIControlStateNormal :普通状态,为默认情 ...
- [android开发篇]java环境配置
http://www.runoob.com/java/java-environment-setup.html Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. window ...
- 【Java 基础】Java 基础索引
Java 基础 注解 [注解]深入理解Java注解类型(@Annotation) [注解]Java注解(1)-基础 [注解]Java注解(2)-运行时框架 [注解]Java注解(3)-源码级框架
- Java核心基础第4篇-Java数组的常规操作
Java数组 一.数组简介 数组是多个相同类型数据的组合,实现对这些数据的统一管理 数组属引用类型,数组型数据是对象(Object) 数组中的元素可以是任何数据类型,包括基本类型和引用类型 数组类型是 ...
- python 基础篇 04(列表 元组 常规操作)
本节主要内容:1. 列表2. 列表的增删改查3. 列表的嵌套4. 元组和元组嵌套5. range 一. 列表1.1 列表的介绍列表是python的基础数据类型之一 ,其他编程语言也有类似的数据类型. ...
- “全栈2019”113篇Java基础学习资料及总结
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- 调度器(scheduler)
调度器(schedule)为游戏提供定时事件和定时调用服务. 调度器(schedule)的功能和事件监听器(eventlistener)的功能有点类似:都是在特定情况下调用某个事先准备好的回调函数. ...
- Hadoop学习之自定义二次排序
一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往 往有要对reduce输出结果进行二次排 ...
- oracle中区分audit_file_dest, background_dump_dest, core_dump_dest, user_dump_dest
一般在$ORACLE_HOME\admin\{SID}目录下: audit_file_dest = /u01/app/oracle/admin/{SID}/adump ...
- 【算法】计算一篇文章的单词数(C、Java语言实现)
1. C语言:一个字符一个字符的读取 (有空再贴出来) 2.Java语言:按行读取,并用正则分割成多个单词,再用MapReduce并行计算单词数 (我使用的是ieda,有些地方跟eclipse有点区别 ...
- MacOS copy图标shell脚本
不会shell 同学做的... 可以看见在当前文件夹下创建了一个icons文件夹 最后还压缩了文件夹 #!/bin/bash # readPlist [plist] [key] function r ...
- sql发邮件
DROP PROCEDURE USP_CheckProductCodeRepeatAndSendMail go ---检查商家是否有重复的商品编号,如果有则发送给系统配置中接收的用户邮箱 CREATE ...
- Linux 中执行命令
第一步: 在txt文件(文件名为cmd_file)中写入代码:echo this is content! 第二步: 授权chmod 555 cmd_file 第三步: 运行 ./cmd_file -- ...
- 解决Flex4 发布后访问 初始化极其缓慢的问题
原文http://blog.163.com/vituk93@126/blog/static/170958034201282222046364/ 昨天找了个免费.net空间,想测试一下做的一个简单Fle ...
- 高级复制实验配置添加复制节点操作时报错:ORA-23308: object GP.T does not exist or is invalid
出错原因: 使用高级复制时,在源端启动复制支持,执行语句:REPADMIN@bys1>execute dbms_repcat.generate_replication_support('gp', ...
- Java的接口及实例
一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...