多线程的使用

Java中最基本的单位:Class

============================================================================
Java所支持的一种技术:多线程;不是所有编程语言都支持。

  进程:是指一个内存中运行的应用程序,
    每个进程都有一个独立的内存空间,
    一个应用程序可以同时运行多个进程;
    进程也是程序的一次执行过程,
    是系统运行程序的基本单位;
    系统运行一个程序即是一个进程从创建、
    运行到消亡的过程。

  线程:进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,可以理解为一个进程便相当于一个单 CPU 操作系统,而线程便是这个系统中运行的多个任务。

=========================================================================================
一、概念--(火车站买票)
   1. 进程与线程
      a. 进程---就是一个内存中正在进行的程序。
         CPU在某一时间段只处理一个程序。
     程序也是一个进程,当程序结束,进程消失。

b. 线程---就是程序中的一个执行路径(控制单元)
     线程在控制着进程的执行;
     它是真正的执行者。

进程与线程的关系:一个进程中至少包含有一个或多个线程。(图解)

示例:得到当前线程名
       System.out.println(Thread.currentThread().getName());

示例:创建一个线程,测试主线程与其他线程
         效率高是因为利用了程序间进入CPU的时间差
   
 
   2. 多线程存在的意义
    多线程可以让我们的程序部分可以产生同时运行的效果,各玩各的。
    提高效率是其次,主要是能让多段代码同时执行。

3. 多线程的目的:
    为了最大限度的利用CPU资源。

4. 多线程的好处与弊端
    好处:解决了多部分同时运行的问题
    弊端:线程太多反倒效率的降低

5. 线程调度:
    按照特定的机制为多个线程分配CPU的使用权。

调度的模式有两种:
    (1) 分时调度:所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;
    (2) 抢占式调度:根据线程的优先级别来获取CPU的使用权。
    JVM的线程调度模式采用了抢占式模式。

总结:虽然操作系统是多线程的,但CPU每一时刻只能做一件事,和人的大脑是一样的。

====================================================
    在Java中,多线程的实现有两种方式:
    继承java.lang.Thread类
    实现java.lang.Runnable接口
====================================================

二、线程创建方式一:继承Thread类

关键词:Thread、run()、start()

1. Thread类创建,分两种写法:
   步骤:
      第1步:定义类继承Thread类;
      第2步:子类中重写Thread类中的run()方法;
      第3步:调用线程的start()方法

写法一:
   子类:-------------------------------------------------
    public class Person extends Thread{
        @overriad
        public void run(){
        System.out.println("这是个线程");
        }
    }

测试类:------------------------------------------------
       Person ps=new Person(); //初始化线程
       ps.start();             //启动线程并调用run方法

写法二:
   测试类:------------------------------------------------
      new Thread(){
    @overriad
    public void run(){
        System.out.println("这是个线程");
    }
      }.start();

***************************************************

实现Runnable接口写法-------------------------------

class Puy implements Runnable{

@overriad
        public void run(){
        System.out.println("这是个线程");
        }

}

测试类:------------------------------------------------

public static void main(String[] args) {
    Puy y=new Puy();
    new Thread(y,"窗口A").start();

}
   1. 为什么要重写run方法?
    目的:将自定义的代码存储在run方法中,让线程运行(也就是将同时要运行的代码写在run()方法中)。
   2. 通过对象.run()调用,不用start()方法调用也可以吗?
    可以,但run()就变成主线程中的方法,与线程没关系。
    因为线程没有开启,你只执行了调用。
   3. run()方法中仅仅是封装多线程运行的代码,而start()则是开启多线程的钥匙。
   4. start()方法是开启多线程,并执行run()方法。
   5. 多线程的一个特性:随机性(谁抢到谁执行,至于执行多长,CPU说了算)

run()方法:在本线程内调用run()方法,和其他方法没有什么区别,可以重复多次调用;

start()方法:启动一个线程,实际上还是调用该Runnable对象的run()方法。

===================================================================

三、线程的操作
   1. 获取线程的名字
       Thread.currentThread().getName();

2. 设置线程优先级
    (1)每个线程都有一个优先级;
    (2)高优先级线程的执行优先于低优先级线程;
    (3)每个线程都可以或不可以标记为一个守护程序。
    (4)当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
    
    setDaemon(true)
    //标识将该线程设置为后台线程,或者叫守护线程,或者叫精灵线程
    例:对象.setDaemon(true)

setPriority()
    //设置的优先级一定要足够长时间才会有效果
    例:对象.setPriority(Thread.MAX_PRIORITY);  //设置最高级别10
        对象.setPriority(Thread.MIN_PRIORITY);  //最低级别1
        对象.setPriority(Thread.NORM_PRIORITY);  //值为5

注意:
    (1)设置线程优先级的代码,要放在.start()前面。
    (2)优先级高不一定代表该线程就先抢到执行权,理论是是可以,但实际情况不一样。

=================================================================

四、线程的状态(生命周期)

||===> 阻塞(临时状态)
                  ||         (有执行资格,没执行权)
         t3 t4 t5         ||
        start()   ||   sleep(time)
  新建 ========> 运行 =============> 冻结(睡眠|等待)
                  || wait()/notify()
           stop() ||
                  ||
                 消亡(真死了)

1.新建:刚new出来在内存中
2.就绪:start表示该线程有资格抢CPU!
3.运行:抢到了CPU,会执行run方法
4.冻结:放弃了执行资格,醒了获得执行资格,但不一定马上执行。
4.死亡:执行完run方法
5.阻塞:调用了sleep方法或其他阻塞的方法

执行资格与执行权
    没执行资格的情况下,是冻结状态;
    有执行资格的是临时状态;
    既有执行资格又有执行权的是运行状态。

友情小知识点:
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:

线程的优势

1、进程之间不能共享内存,而线程之间可以共享内存。

2、系统创建进程需要为该进程重新分配系统资源,创建线程的代价则小的多,因此多任务并发时,多线程效率高。

3、Java 语言本身内置多线程功能的支持,而不是单纯作为底层系统的调度方式,从而简化了多线程编程。

  注意:多线程是为了同步完成多个任务,不是为了提高程序运行效率,而是通过提高资源使用效率来提高系统的效率。

老虎机的编写 

package com.baidu;import java.awt.Color;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;public class MyGame extends JFrame{private boolean fie=true;private long fin=0;private long fis=50;private JPanel jpa=new JPanel();private JLabel jla=new JLabel(new ImageIcon("images//1.png"));private JLabel jlb=new JLabel(new ImageIcon("images//2.png"));private JLabel jlc=new JLabel(new ImageIcon("images//3.png"));private JButton jba=new JButton("开始");private JButton jbb=new JButton("停止");private String[] ima= {"images//1.png","images//2.png","images//3.png","images//4.png","images//5.png","images//6.png",};public MyGame() {this.setTitle("");this.setSize(400,300);this.setDefaultCloseOperation(3);this.setLocationRelativeTo(null);//设置标签边框jla.setBorder(BorderFactory.createLineBorder(Color.black));jlb.setBorder(BorderFactory.createLineBorder(Color.black));jlc.setBorder(BorderFactory.createLineBorder(Color.black));jpa.setLayout(null);jla.setBounds(50, 40, 87, 87);jpa.add(jla);jlb.setBounds(147, 40, 87, 87);jpa.add(jlb);jlc.setBounds(244, 40, 87, 87);jpa.add(jlc);jba.setBounds(120, 167, 60, 40);jpa.add(jba);jbb.setBounds(200, 167, 60, 40);jpa.add(jbb);jbb.setEnabled(false);this.getContentPane().add(jpa);jba.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {jba.setEnabled(false);myshow(jla);myshow(jlb);myshow(jlc);jbb.setEnabled(true);fie=true;new Thread() {public void run() {while(fie) {try {Thread.sleep(fis);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}myshow(jla);myshow(jlb);myshow(jlc);fin+=25;if(fin>1400) {fis+=30;    }if(fis>=450) {jba.setEnabled(true);jbb.setEnabled(false);fin=0;fis=50;break;}}};}.start();}});jbb.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {fin=1400;}});this.setVisible(true);
}
public void myshow(JLabel jla) {Random rd=new Random();int sj=rd.nextInt(6);jla.setIcon(new ImageIcon(ima[sj]));
}public static void main(String[] args) {new MyGame();}}

多线程写法 与老虎机的制作相关推荐

  1. C++新老多线程写法的比较【水一下】

    C++11之前的<pthread.h>写法 #include<bits/stdc++.h>using namespace std;int vall=-1;void* func1 ...

  2. 妹子说头像爬的太慢?升级到多线程程序爬取头像

    需求分析 昨天,我给妹子做了一个爬取头像的爬虫程序,妹子总算是开心起来了,我总算也是松了一口气,然而今天,就接到妹子的投诉了 她说,"你这个程序啊,太慢!爬取一次要花的时间太长!你能不能给改 ...

  3. Python多线程,大杂烩

    搞任何编程语言肯定都离不开多线程,Python肯定也不例外,虽然Python的多线程并不完美,但还是经常会用到滴,尤其是网络爬虫这些东西,效率很很重要,所以我就屁颠屁颠的来写这篇文章啦! 多线程是为了 ...

  4. 浅谈易语言多线程 by逆风

    一.简介 1.线程句柄与线程: ①.关闭线程句柄对线程的运行不会有影响,关闭句柄并不代表结束线程: ②.线程句柄是用于对线程挂起.恢复.结束等操作,线程创建后,都会有一个线程句柄,如果不需要对线程句柄 ...

  5. 简单说说对QT中moveToThread实现多线程操作的理解

      在平时的编码过程中经常碰到QT的多线程问题,也大量接触了QT中的两种主流多线程写法,一种是继承QThread类并重载run函数,在run函数中写一个状态机或者计时器来实现对线程运作:一种是通过mo ...

  6. 信息化基础建设 开发框架

    开发框架 1. ORM, LLBL Gen,NHibernate 2. 接口与实现分离,界面与逻辑分离,分五个项目,     BusinessLogic, Interface,Manager,Vali ...

  7. html语言ppt,HTML语言课件.ppt

    补充:HTML语言 1. HTML简介 2. HTML显示原理 3. HTML制作工具 二. HTML标记 通过用记事本制作第一个HTML文档来了解:用HTML制作网页的一般步骤.一个HTML文档的基 ...

  8. 逆向爬虫08 并发异步编程

    逆向爬虫08 并发异步编程 我将引用我最喜欢的路飞学城林海峰Egon老师的讲课方式来复习这一节的内容. 1. 什么是并发异步编程? 这一部分的内容来源于计算机操作系统,如果想要详细了解并发异步等概念, ...

  9. 杰奇是否生成html,杰奇1.70如何自定义页面

    这个自定义页面是指php页面,具有和其他页面统一的头部和底部.并且可以调用系统区块的. 这种页面的制作可以参考文件 custom.php的写法,它是制作首页的模拟文件. 首选制作首页的模拟文件. 您需 ...

最新文章

  1. 需要将git分支重置为原始版本
  2. [Issue Fixed]-Ubuntu开发环境下遇到的环境问题梳理
  3. SQL注入之布尔盲注——sql-lab第八关
  4. javascript变量中基本类型和引用类型的详解解读
  5. TensorFlow(六)with语句
  6. 新版的sublime text 3无法设为默认启动程序
  7. java springboot aop_Spring Boot实战系列(3)AOP面向切面编程
  8. springboot 对接海康设备
  9. 个人主页博客网页设计制作HTML5+CSS大作业——清新春暖花开个人博客网站(6页)
  10. mysql批量生成随机姓名、手机号等数据
  11. java11降到java8
  12. 31个惊艳的数据可视化作品,让你感受“数据之美”!
  13. linux批处理模式,巧用linux-top的批处理模式
  14. Object不能直接转成int
  15. js判断早上好,上午好,中午好,下午好,晚上好
  16. 编程基础知识(变简单的进制转换)
  17. 【翻译】听觉刺激增强深度睡眠,实现“熟睡自由”
  18. 消息中间件原理及JMS简介(2)
  19. 绝了!美图技术专家获取肉鸡服务器密码如探囊取物
  20. elasticsearch 中文API river

热门文章

  1. Vue通过nginx转发后dist文件页面样式丢失
  2. 使用Gstreamer播放未知格式视频(python)
  3. 前台传入数据后台被转义问题解决
  4. 1. ELK docker部署
  5. android 测光模式,安卓手机里的专业模式究竟该怎么拍?
  6. 判断设备访问类型是PC端还是WAP端
  7. GEF 命令模式介绍
  8. 单例模式——解决MDI子窗体实例化的问题
  9. vue xlsx.js获取单元格数据类型的hooks 单元格类型处理
  10. k8s教程(基础篇)-基本概念和术语