多线程是由Java提出的概念,那么什么是线程呢?这里会涉及到几个名字听着很类似的东西:程序、线程、进程。

程序:存储在磁盘上的一系列的文件,包括可执行文件和不可执行文件。

进程:在内存中,每一个程序都会开启一个进程。

线程:线程是进程的最小执行单元,线程在寄存器中,每一个线程需要消耗一定的cpu资源和512k到1M的内存资源。

多线程:也就是同一个程序中开启多个线程就是多线程。

使用多线程有什么样的优势呢?我们都知道在Java中,代码是一句一句地往下执行的,上面的代码没有执行完毕,下面的另一段代码就必须要等到上面的执行完毕,它才能够执行。如果有程序要求必须在同一时间执行不同的代码的话,单线程就显然无法满足要求了。另外由于多线程是几个线程一同执行,所以可以大大的缩短一些需要大量重复执行的代码的执行时间,打个比方,有一斤米要知道它有多少粒,如果一个人去数的话,不知道要数到什么时候。但是如果多派几个人去数的话,就能够极大的提高效率,节约时间。现实生活是这个样子,程序的执行更加如此。试问如果一个程序要得出结果需要个半分钟,你还愿意去等吗?别说半分钟了,几秒钟都不一定想等。所以多线程的作用就在于此了。多线程能够提高程序的运行速度和执行效率,能够同时执行一段代码,完成单线程无法完成的事情。当然事情都是双面性的,线程有其优点,自然也会有缺陷。前面已经说过线程是要消耗CPU和内存资源的,CPU和内存的资源是有限的。假设这样的一种情况,有好几个线程都要使用CPU,这时应该怎么办呢(线程的异步)。解决方法当然有让先拿到CPU的a线程先执行,其他的线程等待,a线程执行完毕后,释放资源,然后其他的线程再次使用(线程的同步)。但是这样又会产生新的问题,如果a线程和b线程同时执行了,a线程需要等待b线程的资源释放才能够继续,而b线程同样需要a线程的资源释放才能够继续,这样就会陷入一个死回路中,谁也出不来(线程的死锁)。当然我们并不会因为线程有缺陷就不用它,正相反线程的优势是我们需要的,我们当然要用线程。

线程的使用有两种方法:

继承Thread类:Thread类实现了Runnable接口。常用的方法有:run()线程需要完成的事情放在run方法中;sleep()让线程休眠的方法,参数是毫秒数;start()启动线程的方法,然后start会执行run方法。

实现Runnable接口:run()线程需要完成的事情。

需要注意的是:Runnable接口中只有一个抽象的run()方法,它是没有启动线程的方法的,所以实现Runnable接口的类要想启动线程,必须要实例化一个Thread对象,通过调用Thread对象的start方法才能够正常的启动一个线程。不知道大家有没有这样的疑惑:那就是为什么需要调用start方法类启动一个线程,直接调用run方法不行吗?要解释这个问题还需要搞清楚一件事情:那就是如果一个程序没有使用线程,那么这个程序中会不会存在线程。看下面的代码:

public class Test {

    public static void main(String[] args) {
System.out.println("main方法执行了");
System.out.println(Thread.currentThread());
}
}

这段代码输出结果是这样的:

main方法执行了
Thread[main,5,main]

这说明了什么,只要我们程序中存在main方法,那么该程序必然会存在一个线程。也就是说Java的虚拟机会自动为main方法启动一个线程。在Java中的线程是由Java的虚拟机来调度的,我们自己是无法启动线程的,所以需要一个start方法来告诉虚拟机我们要启动一个线程。换句话说,直接调用run方法,就是直接调用了run方法而已,是并没有启动线程的。

下面举一个多线程的例子:

package com.cbs;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.Random; import javax.swing.JFrame;
/**
* 线程类,画小球
* @author CBS
*/
public class ThreadDemo extends Thread { private Graphics g;
private JFrame frame = null; public ThreadDemo() { } public Graphics getG() {
return g;
} public void setG(Graphics g) {
this.g = g;
} public JFrame getFrame() {
return frame;
} public void setFrame(JFrame frame) {
this.frame = frame;
} public ThreadDemo(JFrame frame, Graphics g) {
this.frame = frame;
this.g = g;
System.out.println(frame);
} Random r = new Random();
//随机颜色
Color color = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)); public void run() {
Graphics2D g2d = (Graphics2D) g;
// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
// RenderingHints.VALUE_ANTIALIAS_ON);
//
int speedx = 3;//小球的移动速度
int speedy = 3;
int x = r.nextInt(frame.getWidth());
int y = r.nextInt(frame.getHeight());
while (true) {
if (x < frame.getWidth() && y < frame.getHeight()) {
g2d.setColor(Color.WHITE);
g2d.fillOval(x, y, 30, 30);
x += speedx;
y += speedy;
//判断是否碰到边界,如果是把小球反弹。
if (x > frame.getWidth()-20 && speedx > 0) {
speedx = -speedx;
} else if (x < 10 && speedx < 0)
speedx = -speedx;
if (y >frame.getHeight()-20 && speedy > 0)
speedy = -speedy;
else if (y < 30 && speedy < 0)
speedy = -speedy; g2d.setColor(Color.GREEN);
g2d.fillOval(x, y, 30, 30);
}
try {
//线程休眠
this.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
} } } package com.cbs;
/**
* 主类,用来初始化一个界面
*/ import java.awt.Color;
import java.awt.Graphics;
import java.util.Random; import javax.swing.JFrame; public class Draw { public static void main(String[] args) {
Draw d=new Draw();
d.showUI();
} public void showUI(){
JFrame jf=new JFrame();
jf.setTitle("Moving Point");
jf.setSize(500,500);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.getContentPane().setBackground(Color.WHITE); jf.setVisible(true); Graphics g=jf.getGraphics(); Random r=new Random();
//随机启动多个线程
for(int i=0;i<=r.nextInt(10);i++){
ThreadDemo t=new ThreadDemo();
t.setFrame(jf);
t.setG(g);
t.start();
}
} }

运行后就是几个球在界面上到处乱撞。

ps:有点小bug ,我还不懂怎么回事。

初探Java多线程的更多相关文章

  1. 初探Java字符串

    转载: 初探Java字符串 String印象 String是java中的无处不在的类,使用也很简单.初学java,就已经有字符串是不可变的盖棺定论,解释通常是:它是final的. 不过,String是 ...

  2. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  3. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  4. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  5. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  6. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  7. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  8. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  9. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

随机推荐

  1. linkin大话设计模式--单例模式

    linkin大话设计模式 开文前先弱弱的问一句:什么是设计模式?我在研究java2ee的时候有研究过,在学js的时候也有看到.设计模式的概念最早源于建筑设计大师<建筑的永恒算法>一书,它表 ...

  2. IOS 时间字符串转换时间戳失败问题

    链接:https://pan.baidu.com/s/1nw6VWoD 密码:1peh 有时候获取到的时间带有毫秒数或者是(2018-2-6 11:11:11)格式的(别说你没遇到过,也别什么都让后台 ...

  3. java之过滤器Filter (应用场景)

    filter在开发中的常见应用:     * 1.filter可以目标资源执行之前,进行权限检查,检查用户有无权限,如有权限则放行,如没有,则拒绝访问     * 2.filter可以放行之前,对re ...

  4. HTML核心标签之表格标签(二)

    基本用法: <ul type="cir"> <li>显示数据</li> <li>显示数据</li> </ul> ...

  5. ABP官方文档翻译 4.3 校验数据传输对象

    校验数据传输对象 校验简介 使用数据标注 自定义校验 禁用校验 标准化 校验简介 应用的输入首先应该被校验.输入可以是用户的也可以是其他应用的.在一个web应用中,校验通常实现两次:客户端和服务端.客 ...

  6. SpringMVC源码情操陶冶-DispatcherServlet

    本文对springmvc核心类DispatcherServlet作下简单的向导,方便博主与读者查阅 DispatcherServlet-继承关系 分析DispatcherServlet的继承关系以及主 ...

  7. MySQL5学习笔记(三)

    系统变量 mysqld服务器维护两种变量.全局变量(GLOBAL)影响服务器整体操作.会话变量(SESSION)影响具体客户端连接的操作.     当服务器启动时,它将所有全局变量初始化为默认值.这些 ...

  8. 洛谷 [P3258] 松鼠的新家

    树上差分 对于一条路径 \(u->v\) 来说,设 \(t=LCA(u,v)\) ,d[]为差分数组 ,则有 d[u]++;d[v]++;d[t]--;d[fa[t]]--; 注意:题目中所给的 ...

  9. Effective Java 第三版——32.合理地结合泛型和可变参数

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  10. 【模板小程序】循环方阵构造(仿《剑指offer》循环矩阵打印)

    /* 本程序说明: 输入:方阵大小n,输出:n*n的旋转方阵 举例: 当n=2时,输出: 1 2 4 3 当n=4时,输出: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 ...