//创建自己的线程对象--还没有线程的功能
Thread t1 = new Thread();
Thread t2 = new Thread();
//当执行start方法后,他才有了线程的功能--开启线程
t1.start();
t2.start();//有三个线程(主线程+两个子线程)
t2.run(); //只是调用了t2的run方法
Thread.currentThread() : 可以用在任意的位置, 获取当前的线程。
如果是Thread的子类, 可以在子类中, 使用this获取到当前的线程。
当我们手动调用run的时候,他失去了任务区的功能,变成了一个普通的方法. 当run作为一
个普通方法时,内部对应的线程跟调用他的位置保持一致.
class
自定义线程类名
extends
Thread
{
//
任务区
//
重写
run
方法
,
实现我们的功能
.run
就是我们的任务区
/*
* Thread.currentThread():
获取的是当前的线程
* Thread.currentThread().getName():
线程的名字
*/
@Override
public
void
run
() {
for
(
int
i
=
0
;
i
<
10
;
i
++
) {
System
.
out
.
println
(
this
.
name1
+
"
"
+
Thread
.
currentThread
().
getName
()
+
" i:"
+
i
);
}
}
使用
Runnable
接口
// Runnable
接口的匿名实现类
Runnable runnable
=
new
Runnable
() {
@Override
public
void
run
() {
System
.
out
,
println
(
"
子线程处理的逻辑
"
);
}
};
//
实例化线程对象
Thread thread
=
new
Thread
(
runnable
);
}
继承的方式: 优点在于可读性比较强, 缺点在于不够灵活。 如果要定制一个线程, 就
必须要继承自
Thread
类, 可能会影响原有的继承体系。
接口的方式: 优点在于灵活, 并且不会影响一个类的继承体系。 缺点在于可读性较差。
/
线程与任务不分离
SubThread s1 = new SubThread();
s1.start();
class
SubThread
extends
Thread
{
static
int
num
=
20
;
//
想让大家共用这个
num
@Override
public
void
run
() {
for
(
int
i
=
0
;
i
<
5
;
i
++
) {
System
.
out
.
println
(
Thread
.
currentThread
().
getName
()
+
" num:"
+
--
num
);
//
线程与任务分离
Ticket ticket
=
new
Ticket
();
t1
.
start
();
class
Ticket
implements
Runnable
{
int
num
=
20
;
//
想让大家共用这个
num
@Override
public
void
run
() {
for
(
int
i
=
0
;
i
<
5
;
i
++
) {
System
.
out
.
println
(
Thread
.
currentThread
().
getName
()
+
" num:"
+
--
num
);
}
}
//
设置线程的名字
thread
.
setName
(
"
子线程的名字
"
);
Thread
类对象, 在进行实例化的时候, 可以同时设置线程的名字。
public class
Program
{
public static
void
main
(
String
[]
args
) {
//
使用接口的方式进行线程的实例化
Thread thread
=
new
Thread
(()
->
{},
"
线程的名字
"
);
}
}
使用
super(String) 进行父类方法的调用
进行名称的设置
public class
MyThread
extends
Thread
{
public
MyThread
(
String
name
) {
super
(
name
);
}
@Override
public
void
run
() {
System
.
out
.
println
(
"
子线程的逻辑
"
);
}
}
设置线程名字, 可以使用上述三种方式, 但是获取线程线程的名字, 只有一个方法, 就是
getName()
public class
Program
{
public static
void
main
(
String
[]
args
) {
//
使用接口的方式进行线程的实例化
Thread thread
=
new
Thread
(()
->
{},
"
线程的名字
"
);
System
.
out
.
println
(
thread
.
getName
());
}
}
同步代码块儿的构成
:
synchronized
(
锁
(
对象
)){
同步的代码
}
synchronized
关键字是不能继承的,也就是说,基类的方法
synchronized f(){}
在继承类中并
不自动是
synchronized f(){}
,而是变成了
f(){}
。继承类需要你显式的指定它的某个方法为
synchronized
方法;
SaveMoney saveMoney
=
new
SaveMoney
();
//2.
创建两个线程当做两个人
Thread t0
=
new
Thread
(
saveMoney
);
Thread t1
=
new
Thread
(
saveMoney
);
//3.
开启线程
t0
.
start
();
t1
.
start
();
class
Bank
{
public synchronized static
void
addMoney
(
int
money
) {
// this.money += money;
// System.out.println(this.money);
}