當有線程正在讀的時候,不允許寫 線程寫,但是允許其他的讀線程進行讀。有寫線程正在寫的時候,其他的線程不應該讀寫。為了防止寫線程出現饑餓現象,當線程正在讀,如果寫線程請求寫,那么應該禁止再來的讀線程進行讀。
實現代碼如下:
File.Java
1
2
3
4
5
6
7
8
9
10
|
package readerWriter; public class File { private String name; public File(String name) { this .name=name; } } |
Pool.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package readerWriter; public class Pool { private int readerNumber= 0 ; private int writerNumber= 0 ; private boolean waittingWriten; public boolean isWaittingWriten() { return waittingWriten; } public void setWaittingWriten( boolean waittingWriten) { this .waittingWriten = waittingWriten; } public File getFile() { return file; } public void setFile(File file) { this .file = file; } File file; public Pool(File file) { this .file=file; } public int getReaderNumber() { return readerNumber; } public void setReaderNumber( int readerNumber) { this .readerNumber = readerNumber; } public int getWriterNumber() { return writerNumber; } public void setWriterNumber( int writerNumber) { this .writerNumber = writerNumber; } } |
Reader.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
package readerWriter; public class Reader implements Runnable{ private String id; private Pool pool; public Reader(String id,Pool pool) { this .id=id; this .pool=pool; } @Override public void run() { // TODO Auto-generated method stub while (!Thread.currentThread().interrupted()){ synchronized (pool){ while (pool.getWriterNumber()> 0 || pool.isWaittingWriten()== true ) //當線程正在寫或者 //有線程正在等待寫,則禁止讀線程繼續讀 { try { pool.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } { pool.setReaderNumber(pool.getReaderNumber()+ 1 ); } } System.out.println(id+ " " + "is reading...." ); try { Thread.sleep( 1000 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized (pool) { pool.setReaderNumber(pool.getReaderNumber()- 1 ); System.out.println(id+ " " + "is existing the reader...." ); if (pool.getReaderNumber()== 0 ) pool.notifyAll(); } try { Thread.sleep( 1000 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // pool.notifyAll(); } } } |
Writer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
package readerWriter; public class Writer implements Runnable{ private Pool pool; String id; public Writer(String id,Pool pool) { this .id=id; this .pool=pool; } @Override public void run() { // TODO Auto-generated method stub while (!Thread.currentThread().interrupted()){ synchronized (pool){ if (pool.getReaderNumber()> 0 ) pool.setWaittingWriten( true ); else pool.setWaittingWriten( false ); //當線程正在被讀或者被寫或者有線程等待讀 while (pool.getWriterNumber()> 0 || pool.getReaderNumber()> 0 ) { try { pool.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } pool.setWaittingWriten( false ); //這個策略還算公平 { pool.setWriterNumber(pool.getWriterNumber()+ 1 ); } } System.out.println(id+ " " + "is writing...." ); try { Thread.sleep( 1000 ); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // synchronized (pool) { pool.setWriterNumber(pool.getWriterNumber()- 1 ); System.out.println(id+ " " + "is existing the writer...." ); pool.notifyAll(); } /* try { Thread.sleep(1000); //System.out.println("writer sleeping over"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } */ } } } |
Main.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
package readerWriter; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Pool pool= new Pool( new File( "dd file" )); for ( int i= 0 ;i< 2 ;i++) { Thread writer= new Thread( new Writer( "writer " +i,pool)); writer.start(); } for ( int i= 0 ;i< 5 ;i++) { Thread reader= new Thread( new Reader( "reader " +i,pool)); reader.start(); } } } |
程序部分運行結果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... reader 0 is reading.... reader 0 is existing the reader.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... reader 3 is reading.... reader 2 is reading.... reader 4 is reading.... reader 1 is reading.... reader 0 is reading.... reader 3 is existing the reader.... reader 1 is existing the reader.... reader 0 is existing the reader.... reader 4 is existing the reader.... reader 2 is existing the reader.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 1 is writing.... writer 1 is existing the writer.... reader 2 is reading.... reader 2 is existing the reader.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... writer 0 is existing the writer.... writer 0 is writing.... |
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/m1457285665/article/details/44501339