JavaSE15—多线程
1. 多线程简介
程序:程序是计算机指令的集合,是以文件形式存储在磁盘上的。
进程:进程是一个运行的程序,每一个进程都有其独立的内存空间和系统资源。
线程:线程是进程中的实体,一个进程可以拥有许多个线程。
一个进程中可以包含一个或多个线程,在单线程中,程序代码按调用顺序依次往下执行。通畅所说的多线程,指的是一个进程可以同时运行几个任务,每个任务由一个线程来完成。也就是说,多个线程可以同时运行,并且在一个进程内执行不同的任务。
在Java中实现多线程有两种方式:一种是继承Thread类,另一种是实现Runnable接口
线程具有生命周期,包含4个状态,分别为创建,可执行,非执行以及消亡状态。
1. 创建
当实例化一个线程对象并执行start()方法后,线程进入”可执行”状态,开始执行时,虽然多线程给用户一种同时执行的感觉,但事实上在同一时间点只有一个线程在执行,只是线程之间转换的动作很快,因此看起来好像同时在执行一样。
2. 可执行
当线程启用start()方法后,进入可执行状态,执行用户覆盖的run方法。一个线程进入可执行状态下,并不代表可以一直执行到run()结束为止。事实上它是加入次应用程序执行安排的序列中,一个处于可执行状态下的线程,实际上可能在等待处理机调度,也可能是等待某IO事件。
3. 非可执行
当线程离开可执行状态的队列中,线程即进入非可执行状态。
4. 消亡
当run()方法执行1后,线程自动消亡,当Thread类调用start()方法时,Java虚拟机自动调用它的run()方法,而当run()方法结束时,该Thread类自动终止
2. 实现多线程的两种方法
1) 通过继承Thread类创建多线程
Thread类是Java的线程类,该类的实例对象是线程对象,因此继承该类编写线程子类是实现多线程的方式之一。通过重写Thread类中的run方法,以实现用户所需要的功能,实例化所定义的Thread类,使start()方法启动线程。
语法如下:
public class ClassName extends Thread
{
public void run(){
//详细代码
}
}
Thread类的start()方法用于启动一个线程对象
实例:创建ThreadDemo类,改类继承自Thread类并重写run方法成为线程类,在主方法中创建两个鼠类的实例对象,分别设置name为小白鼠和小灰鼠,然后同时启动两个线程在控制台查看运行情况。
如果继承Thread类实现线程类有一个缺点就是无法继承其他类。这时可以通过实现Runnable接口来创建多线程类。
Runnable接口同样定义了run()方法,实现改接口的同时,必须实现接口中的run()方法。当使用Thread()方法创建线程对象时,需要为该方法传递一个实现了Runnable接口的类对象,这样创建的线程将调用那个实现了Runnable接口的类对象中的run()方法作为其运行代码。
语法:
public class Simple implements Runnable{
Simple simple = new Simple();
Thread thread = new Thread(simple);
thread.start();
}
实例:在项目中创建SimpleThread类,改类继承JFrame类实现窗体类,同时实现Runnable接口实现多线程类。通过多线程实现将窗体中的标签先由小变大,再由大变小。
1) 线程的启动
执行run()方法通过调用Thread类中的start()方法来实现。
2) 线程的休眠
通过:
try{
Thread.sleep(2000);
}catch(Exception e){
e.printStackTrace();
}
来实现进程的休眠
3) 进程的停止
public class InterruptedTest implements Runnable{
private boolean isContinue = false;
public void run(){
while(true){
//省略
if(isContinue)
break;
}
}
public void setContinue(){
this.isContinue = true;
}
}
实例:创建窗体,在窗体中添加文本域控件,通过多线程机制实现向文本域中添加数字,当数字达到100时,是线程停止。
在Java中线程有优先级,优先级范围从1~10,默认为5,可以使用setPriority()方法来设定线程的优先级,优先级越高,会被提前执行。
4.综合实例:
1)创建窗体,实现窗体中添加会游泳的鱼。
1. 多线程简介
程序:程序是计算机指令的集合,是以文件形式存储在磁盘上的。
进程:进程是一个运行的程序,每一个进程都有其独立的内存空间和系统资源。
线程:线程是进程中的实体,一个进程可以拥有许多个线程。
一个进程中可以包含一个或多个线程,在单线程中,程序代码按调用顺序依次往下执行。通畅所说的多线程,指的是一个进程可以同时运行几个任务,每个任务由一个线程来完成。也就是说,多个线程可以同时运行,并且在一个进程内执行不同的任务。
在Java中实现多线程有两种方式:一种是继承Thread类,另一种是实现Runnable接口
线程具有生命周期,包含4个状态,分别为创建,可执行,非执行以及消亡状态。
1. 创建
当实例化一个线程对象并执行start()方法后,线程进入”可执行”状态,开始执行时,虽然多线程给用户一种同时执行的感觉,但事实上在同一时间点只有一个线程在执行,只是线程之间转换的动作很快,因此看起来好像同时在执行一样。
2. 可执行
当线程启用start()方法后,进入可执行状态,执行用户覆盖的run方法。一个线程进入可执行状态下,并不代表可以一直执行到run()结束为止。事实上它是加入次应用程序执行安排的序列中,一个处于可执行状态下的线程,实际上可能在等待处理机调度,也可能是等待某IO事件。
3. 非可执行
当线程离开可执行状态的队列中,线程即进入非可执行状态。
4. 消亡
当run()方法执行1后,线程自动消亡,当Thread类调用start()方法时,Java虚拟机自动调用它的run()方法,而当run()方法结束时,该Thread类自动终止
2. 实现多线程的两种方法
1) 通过继承Thread类创建多线程
Thread类是Java的线程类,该类的实例对象是线程对象,因此继承该类编写线程子类是实现多线程的方式之一。通过重写Thread类中的run方法,以实现用户所需要的功能,实例化所定义的Thread类,使start()方法启动线程。
语法如下:
public class ClassName extends Thread
{
public void run(){
//详细代码
}
}
Thread类的start()方法用于启动一个线程对象
实例:创建ThreadDemo类,改类继承自Thread类并重写run方法成为线程类,在主方法中创建两个鼠类的实例对象,分别设置name为小白鼠和小灰鼠,然后同时启动两个线程在控制台查看运行情况。
package qijia.si; public class TestDemo extends Thread{ private String name = "未知"; public TestDemo(String name){ this.name = name; } public void run(){ while(true){ try{ System.out.println(name+":跑到前面了"); Thread.sleep((int)(Math.random()*10000)); }catch(Exception e){ e.printStackTrace(); } } } public static void main(String[] args){ Thread writer1 = new TestDemo("小白鼠"); Thread writer2 = new TestDemo("小灰鼠"); writer1.start(); writer2.start(); } }2)通过实现Runnable接口
如果继承Thread类实现线程类有一个缺点就是无法继承其他类。这时可以通过实现Runnable接口来创建多线程类。
Runnable接口同样定义了run()方法,实现改接口的同时,必须实现接口中的run()方法。当使用Thread()方法创建线程对象时,需要为该方法传递一个实现了Runnable接口的类对象,这样创建的线程将调用那个实现了Runnable接口的类对象中的run()方法作为其运行代码。
语法:
public class Simple implements Runnable{
Simple simple = new Simple();
Thread thread = new Thread(simple);
thread.start();
}
实例:在项目中创建SimpleThread类,改类继承JFrame类实现窗体类,同时实现Runnable接口实现多线程类。通过多线程实现将窗体中的标签先由小变大,再由大变小。
package qijia.si; import java.awt.EventQueue; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JFrame; public class TestDemo extends JFrame implements Runnable { final JLabel jlabel = new JLabel(); //定义标签对象 public static void main(String args[]) { TestDemo frame = new TestDemo(); //创建本类对象 frame.setVisible(true); //设置窗体为可视 } public TestDemo() { super(); //调用父类构造 getContentPane().setLayout(null); //设置窗体布局 setBounds(100, 100, 193, 167); //定义窗体显示位置与大小 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置窗体关闭状态 URL url = getClass().getResource("/11111222.jpg"); //定义图片地址 ImageIcon icon = new ImageIcon(url); //根据图片地址创建图片对象 Thread thread = new Thread(this); //创建线程对象 thread.start(); //启动线程 jlabel.setBounds(40, 10, 102, 111); //设置标签显示位置与大小 jlabel.setIcon(icon); //设置标签显示图片 getContentPane().add(jlabel); } public void run() { while (true) { //设置无限循环 for (int i = 0; i <= 100; i++) { jlabel.setBounds(40, 10, i, i); //设置标签大小 try { Thread.sleep(50); //使线程休眠 } catch (InterruptedException e) { e.printStackTrace(); } if (i == 100) { for (int j = 100; j >= 0; j--) { jlabel.setBounds(40, 10, j, j); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } }3. 线程控制
1) 线程的启动
执行run()方法通过调用Thread类中的start()方法来实现。
2) 线程的休眠
通过:
try{
Thread.sleep(2000);
}catch(Exception e){
e.printStackTrace();
}
来实现进程的休眠
3) 进程的停止
public class InterruptedTest implements Runnable{
private boolean isContinue = false;
public void run(){
while(true){
//省略
if(isContinue)
break;
}
}
public void setContinue(){
this.isContinue = true;
}
}
实例:创建窗体,在窗体中添加文本域控件,通过多线程机制实现向文本域中添加数字,当数字达到100时,是线程停止。
package qijia.si; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; public class TestDemo extends JFrame implements Runnable{ JTextArea textArea; public TestDemo(){ super(); getContentPane().setLayout(null); setBounds(100,100,296,217); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(0,0,288,183); getContentPane().add(scrollPane); textArea = new JTextArea(); textArea.setLineWrap(true); scrollPane.setViewportView(textArea); Thread thread = new Thread(this); thread.start(); } public void run(){ int count = 0; while(true){ try{ Thread.sleep(100); textArea.append(++count+" "); if(count ==100 ) break; }catch(Exception e){ e.printStackTrace(); } } } public static void main(String[] args){ TestDemo td = new TestDemo(); td.setVisible(true); } }4) 线程的优先级
在Java中线程有优先级,优先级范围从1~10,默认为5,可以使用setPriority()方法来设定线程的优先级,优先级越高,会被提前执行。
4.综合实例:
1)创建窗体,实现窗体中添加会游泳的鱼。
package qijiasi; import java.awt.EventQueue; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class TestDemo extends JFrame implements Runnable{ final JPanel jpanel = new JPanel(); final JLabel label = new JLabel(); public TestDemo(){ super(); getContentPane().setLayout(null); setBounds(100,100,345,193); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jpanel.setLayout(null); jpanel.setBounds(0,0,337,159); getContentPane().add(jpanel); URL url = getClass().getResource("fish.png"); ImageIcon imageicon = new ImageIcon(url); label.setIcon(imageicon); label.setBounds(271,47,66,60); jpanel.add(label); Thread thread = new Thread(this); thread.start(); } public void run(){ while(true){ int lx = label.getX() - 1; if(label.getX()>jpanel.getX()){ label.setLocation(lx,label.getY()); }else{ label.setBounds(271,47,66,60); } try{ Thread.sleep(30); }catch(Exception e){ e.printStackTrace(); } } } public static void main(String[] args){ TestDemo td = new TestDemo(); td.setVisible(true); } }
发表评论
-
JavaSE20—绘图
2011-05-18 20:10 1502JavaSE20—绘图 1. 绘制图形 Graphics类是 ... -
JavaSE19—Swing高级控件(下)
2011-05-15 17:28 1086JavaSE19—Swing高级控件(下) 1. 工具栏与对话 ... -
JavaSE18—Swing高级控件(上)
2011-05-12 22:22 1491JavaSE18—Swing高级控件(上) 1. 为窗体添加 ... -
JavaSE17—GUI事件
2011-05-08 20:52 1037JavaSE17—GUI事件处理机 ... -
JavaSE14—窗体程序开发(下)
2011-05-01 16:55 965JavaSE14—窗体程序开发(下) 1. 基础组件(续) ... -
JavaSE13—窗体程序开发(中)
2011-05-01 16:53 1131JavaSE13—窗体程序开发(中) 1、 布局方式 1) ... -
JavaSE12—窗体程序开发(上)
2011-04-29 16:59 1462JavaSE12—窗体程序开发 ... -
JavaSE11—网络编程初步
2011-04-29 16:58 937JavaSE11—网络编程初步 1. 背景知识 1) 端口 ... -
JavaSE 10 —IO流
2011-04-28 20:00 862JavaSE 10 —IO流 1.IO流简介 Java的输入 ... -
JavaSE09—Java类集框架
2011-04-26 19:32 834JavaSE09—Java类集框架 1. 类集接口 接口: ... -
JavaSE08—包,访问权限及异常处理
2011-04-26 19:31 629JavaSE08—包,访问权限 ... -
JavaSE07—Java常用类库
2011-04-26 19:30 626JavaSE07—Java常用类库 1. String类和S ... -
JavaSE06—类的其他问题
2011-04-26 19:28 664JavaSE06—类的其他问题 1. Objec ... -
JavaSE05—抽象类与接口
2011-04-26 19:27 618JavaSE05—抽象类与接口 1. ... -
JavaSE04—类的封装,继承与多态
2011-04-26 19:26 682JavaSE04—类的封装,继 ... -
JavaSE03—类和对象
2011-04-26 19:24 626JavaSE03—类和对象 1. ... -
Java SE02——数组
2011-04-26 19:23 626Java SE02——数组 1. 数组的声 ... -
Java SE01——原生数据类型
2011-04-26 19:18 831Java SE01——原生数据类型 1.Java中的数据类 ...
相关推荐
javase开发的多线程聊天室 ,每位用户独立享有socket,保证聊天速度
JavaSE 多线程资料 课程总结 概述 细节
Java是一门多线程语言。 进程:每一个软件运行,就会在操作系统中产生一个进程。进程其实也是一个线程,也叫主线程。程序运行过程中,也可产生子线程,子线程也可以处理问题,一个程序可以同时进行多项任务。 线程的...
多线程相关知识 相关说明 标题:进阶课程之并发编程快速入门与多线程实战项目> 课程内容: 1.CPU调度算法原理(先来先服务、最短作业法、优先级调度算法) 2.站在字节码角度+cpu上下文切换角度分析线程安全问题 3....
JavaSE-06多线程 JavaSE-06多线程 JavaSE-06多线程 JavaSE-06多线程
JavaSE多线程编程专题
看B站视频项目总结的系列文档,仅供个人学习使用
javase多线程中的经典案例,生产者消费者问题,详细见代码
入门级笔记,适合查漏补缺。
JavaSE多线程三PPT教案学习.pptx
思维导图:含括多线程概念,线程创建开启方式,线程安全,线程状态及常见问题
多线程的常见问题总结分析 1、多线程技术介绍 2、主线程介绍 3、创建线程的方式 4、线程中的异常问题 5、线程运行状态 6、线程第二种创建方式 7、多线程练习 8、线程安全问题分析和解决 9、多线程细节 10、同步使用...
java多线程知识点,源代码案例,代码案例中包括如何创建线程,主线程,线程优先级,线程组,线程同步,死锁,线程间的通信知识点
马士兵多线程训练营上课笔记
进程与线程的区别,线程的操作状态,线程的操作方法,线程的同步与死锁,线程经典案例,生产者-消费者,现线程的生命周期
javaSE学完练手的项目,无图形界面,易于上手学习
根据毕向东老师的讲课视频整理的程序清单,欢迎下载,大家一块学习!
JavaSE学习笔记,多线程,I/O流,集合,反射,常用设计模式
使用多线程实现的java聊天程序,含源代码
多线程的概念在Java中实现多线程Thread类Runnable接口线程的生命周期和线程状态后台线程线程同步