线程的相关定义
进程
启动一个程序、运行的这一个过程成为一个进程。
线程
启动一个程序后,在该程序里做各种事情,各自分工不同的过程,每个过程叫做一个线程。
进程与线程的实例
1、启动了eclipse程序,该过程可以称为是一个进程(相对于系统来说),然后再eclipse中同时运行多条代码,每一个运行的过程是一个线程。
2、对于每个运行的代码,当点击运行时,该过程成为一个进程(相对于JVM运行环境来说),运行主函数、其他函数,或先后或同时的运行多个函数的过程,这多个过程中每一个是一个线程。
线程运行实例
多线程
含义
多个线程同时运行。
使用方法
1、继承Thread类。
2、实现Runnable接口。
(两种用法的区别:使用接口列出所有的接口中的函数、使用继承要注意一个类只能继承一个类,不能同时继承多个类,但是一个类可以有多个接口)
多线程运行过程中的易错点
多线程同时对一个变量进行修改
修改方法:
1、将这个变量局部化。(原来的方法出错的原因是因为这个变量在这些线程的范围内=>导致这些线程都可以对这个变量修改)
代码段的理解:
十个线程运行会对全局变量x进行操作,最后输出的x是不规则的,因为x是被这是个线程共享的。(共享=>每个线程对x进行+1+2+……+10最后一共加了55,而虽然每次输出的x不规则,但是最后一次的x永远是550,证明这是个线程的每个的55都给了这一个x)
改善:
int x=0; //此时的x属于全局变量 =>可以
public void count() {
//如果将段首的int x=0;放到这个count方法中=>相当于每次调用这
//个方法(运行这个线程)都声明了一个属于自个儿的x。
//int x=0; 输出十个55.
for (int i = 0; i <= 10; i++) {
x+=i;
}
System.out.println(x);
}
public static void main(String[] args) {
//runable 是系统已经有的线程类,可以直接创建对象
Runnable counteRunnable = new Runnable() {
Add counterAdd = new Add();
@Override
public void run() { //用的是接口Runnable=>重写run函数
counterAdd.count();
}
};
//通过用runable创建了线程对象,叫countrunable,
//通过循环结构来开启这十个线程。
for (int i = 0; i < 10; i++) {
new Thread(counteRunnable).start();
}
2、让对象局部化*
int x=0;
public void count() {
for (int i = 0; i <= 10; i++) {
x+=i;
}
System.out.println(x);
}
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
Add add = new Add();
add.count();
}
};
//创建线程对象的过程
for (int i = 0; i < 10; i++) {
new Thread(runnable).start();
}
}